JSON: Having trouble parsing map keys with dots like {"foo.bar":"baz"}

184 views
Skip to first unread message

ma...@markhansen.co.nz

unread,
Jan 28, 2020, 8:48:03 AM1/28/20
to golang-nuts
Hi folks, for background, I'm trying to read the Kaiterra API using encoding/json, which has JSON values like this:

{"id":"00000000-0001-0001-0000-00007e57c0de","info.aqi":{"ts":"2018-03-26T08:53:20Z","data":{"pm10":120,"pm25":214}}}

I'm having trouble parsing the "info.aqi" field using encoding/json. I set the "info.aqi" field as a struct tag `json: "info.aqi"`, but the struct is just empty after parsing.

It seems more likely I'm holding it wrong, but I'm wondering if perhaps this is a bug in Go's JSON parsing?

I thought I'd make a minimal repro test, which fails:

package main

import (
"encoding/json"
"strings"
"testing"
)

type Foo struct {
BazBar string `json: "baz.bar"`
Qux    string `json: "qux"`
}

func TestDotKeyJsonParsing(t *testing.T) {
f := &Foo{}
d := json.NewDecoder(strings.NewReader(`{"baz.bar": "hello", "qux": "hi"}`))
err := d.Decode(f)
if err != nil {
t.Fatalf("json decoding failed: %v", err)
}
if f.Qux != "hi" {
t.Fatalf("Expected f.Qux to be hi")
}

if f.BazBar != "hello" {
t.Errorf("wanted: hello, got: %q", f.BazBar)
}
}

And the Qux field passes fine, but the BazBar field is not set, so the test fails there:
--- FAIL: TestDotKeyJsonParsing (0.00s)
    /Users/mark/projects/godot/dot_test.go:26: wanted: hello, got: ""

Lutz Horn

unread,
Jan 28, 2020, 9:00:05 AM1/28/20
to ma...@markhansen.co.nz, golang-nuts
Remove the blank in ``json: "baz.bar"` and make it `json:"baz.bar"`. This works: https://play.golang.com/p/i9SURYgGO66

________________________________________
Von: golan...@googlegroups.com <golan...@googlegroups.com> im Auftrag von ma...@markhansen.co.nz <ma...@markhansen.co.nz>
Gesendet: Dienstag, 28. Januar 2020 12:14
An: golang-nuts
Betreff: [go-nuts] JSON: Having trouble parsing map keys with dots like {"foo.bar":"baz"}

Hi folks, for background, I'm trying to read the Kaiterra API<https://www.kaiterra.com/dev/#overview> using encoding/json, which has JSON values like this:
--
You received this message because you are subscribed to the Google Groups "golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts...@googlegroups.com<mailto:golang-nuts...@googlegroups.com>.
To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/539f857c-d96a-45af-9a74-c328753bd12d%40googlegroups.com<https://groups.google.com/d/msgid/golang-nuts/539f857c-d96a-45af-9a74-c328753bd12d%40googlegroups.com?utm_medium=email&utm_source=footer>.

Jake Montgomery

unread,
Jan 28, 2020, 9:59:51 AM1/28/20
to golang-nuts
FYI - "go vet" will catch this. Running "go vet" is always a good idea.
To unsubscribe from this group and stop receiving emails from it, send an email to golan...@googlegroups.com<mailto:golang-nuts+unsubscribe@googlegroups.com>.

Rich

unread,
Jan 28, 2020, 11:15:28 AM1/28/20
to golang-nuts
All of these are good suggestions -- but when working with JSON I find this package to be very helpful: 


I use json as a config file for my programs and when users fat finger the config, forget a comma or put a space in the wrong place -- this for the most part fixes those minor blunders.  I've also found that even though another system generated the JSON, it might not be fully compliant with what I wrote, hjson-go has bailed me out on more than one project. 

Mark Hansen

unread,
Jan 28, 2020, 4:13:41 PM1/28/20
to Lutz Horn, golang-nuts
Ah, thanks! Thought I might be holding it wrong.

Still though, isn’t it strange that the extra space works if you don’t have the dot in the key?

Mark Hansen

unread,
Jan 29, 2020, 4:27:00 AM1/29/20
to Lutz Horn, golang-nuts
Ah, I see what's going on: Go is mapping the "qux" field to the Qux struct arg just because they're case-insensitively equal. Go's totally ignoring my invalid struct tag.

D'oh, I was totally holding it wrong. Thanks everyone! :-)
Reply all
Reply to author
Forward
0 new messages