I'm not sure if I see a bug here. It seems to me that json.Unmarshal is working as documented.
Have you read this part of the encoding/json docs?
The Go visibility rules for struct fields are amended for JSON when deciding which field to marshal or unmarshal. If there are multiple fields at the same level, and that level is the least nested (and would therefore be the nesting level selected by the usual Go rules), the following extra rules apply:
Of those fields, if any are JSON-tagged, only tagged fields are considered, even if there are multiple untagged fields that would otherwise conflict.
If there is exactly one field (tagged or not according to the first rule), that is selected.
Otherwise there are multiple fields, and all are ignored; no error occurs.
In the original sample, what's happening is that there are multiple conflicting JSON-tagged fields. Therefore, the last rule applies. All fields are ignored, no error occurs.