Some JSON data I am getting have spaces in the key names. I am using standard encoding/json
library to unmarshal the data. However it is unable to understand the keys with spaces in the schema. For e.g. following code:
package main
import (
"encoding/json"
"fmt"
)
func main() {
var jsonBlob = []byte(`[
{"Na me": "Platypus", "Order": "Monotremata"},
{"Na me": "Quoll", "Order": "Dasyuromorphia"}
]`)
type Animal struct {
Name string `json: "Na me"`
Order string `json: "Order,omitempty"`
}
var animals []Animal
err := json.Unmarshal(jsonBlob, &animals)
if err != nil {
fmt.Println("error:", err)
}
fmt.Printf("%+v", animals)
}
Gives the output as:
[{Name: Order:Monotremata} {Name: Order:Dasyuromorphia}]
So in the schema the library removes the space(from Na me) and try to find the key (Name), which is obviously not present. Any suggestion what can I do here?
Your
json
tag specification is incorrect, that's why theencoding/json
library defaults to the field name which isName
. But since there is no JSON field with"Name"
key,Animal.Name
will remain its zero value (which is the empty string""
).Unmarshaling
Order
will still work, because thejson
package will use the field name ifjson
tag specification is missing (tries with both lower and upper-case). Since the field name is identical to the JSON key, it works without extra JSON tag mapping.You can't have a space in the tag specification after the colon and before the quotation mark:
With this simple change, it works (try it on the Go Playground):