tidwall / gjson

Get JSON values quickly - JSON parser for Go
MIT License
14.2k stars 846 forks source link

Can not return value when a period/dot is in key even if escaped #355

Open eexbee opened 5 months ago

eexbee commented 5 months ago

go1.18.1 linux/amd64 gjson version 1.17.1

sample json:

{
"timestamp": "2024-04-17T05:39:04",
"MAIN.uptime": {
    "description": "Child process uptime",
    "flag": "c", "format": "d",
    "value": 320
  },

  "MAIN.sess_conn": {
    "description": "Sessions accepted",
    "flag": "c", "format": "i",
    "value": 8
  },

  "MAIN.sess_drop": {
    "description": "Sessions dropped",
    "flag": "c", "format": "i",
    "value": 0
  },
...
}

I want to retrieve the value inside MAIN.sess_conn, I've tried all this and it prints empty string:

fmt.Println(gjson.Get(json, gjson.Escape("MAIN.sess_conn")))  // prints blank line
fmt.Println(gjson.Get(json, `MAIN\.sess_conn.flag`))  // prints blank line
fmt.Println(gjson.Get(json, `MAIN\.sess_conn.value`).String())  // prints blank line

Even the Exists method returns false

fmt.Println(gjson.Get(json, `MAIN\.sess_conn.value`).Exists())  // prints false
fmt.Println(gjson.Get(json, `MAIN\.sess_conn`).Exists())  // prints false
tidwall commented 5 months ago

It all works for me.

json := `{
    "timestamp": "2024-04-17T05:39:04",
    "MAIN.uptime": {
        "description": "Child process uptime",
        "flag": "c", "format": "d",
        "value": 320
        },

        "MAIN.sess_conn": {
        "description": "Sessions accepted",
        "flag": "c", "format": "i",
        "value": 8
        },

        "MAIN.sess_drop": {
        "description": "Sessions dropped",
        "flag": "c", "format": "i",
        "value": 0
        }
    }
}`
fmt.Println(gjson.Get(json, gjson.Escape("MAIN.sess_conn"))) // prints blank line
fmt.Println(gjson.Get(json, `MAIN\.sess_conn.flag`)) // prints blank line
fmt.Println(gjson.Get(json, `MAIN\.sess_conn.value`).String()) // prints blank line

// Output:
// {
//      "description": "Sessions accepted",
//      "flag": "c", "format": "i",
//      "value": 8
//      }
// c
// 8