How to parse below two JSON and print values of "c"
1)
{
"a": {
"b": {
"c": 123
},
"b": {
"c": 456
}
}
}
2)
{
"a": {
"b": {
"c": 444
}
}
}
Below struct help in parsing but then how to iterate over b, it is not array? Please help.
type Data struct {
A struct {
B struct {
C int `json:"c"`
} `json:"b"`
} `json:"a"`
}
Thanks Cerise Limón and Minji
There is JSON.RawMessage type which solved the issue That invalid JSON format is received from third party API so cant change that.
package main
import (
"encoding/json"
"fmt"
"log"
"strings"
)
type DatainC struct {
C int `json:"c"`
}
type Data struct {
A json.RawMessage `json:"a"`
}
func main() {
blob := `{
"a": {
"b": {
"c": 123
},
"b": {
"c": 456
}
}
}`
var abc Data
if err := json.Unmarshal([]byte(blob), &abc); err != nil {
log.Fatal(err)
}
data, _ := abc.A.MarshalJSON()
//log.Println("JSON Data", string(data))
dec := json.NewDecoder(strings.NewReader(string(data)))
// read open bracket
t, err := dec.Token()
if err != nil {
log.Fatal(err)
}
fmt.Printf("%T: %v
", t, t)
for dec.More() {
t1, err1 := dec.Token()
if err1 != nil {
log.Fatal(err1)
}
if t1 == "b" {
var c DatainC
err2 := dec.Decode(&c)
if err2 != nil {
log.Fatal(err2)
}
fmt.Println("Value of C - ", c.C)
}
}
}
the first one is invalid json. if you want to iterate over "b", should be like this
{
"a": {
"b": [
{"c":123},
{"c":456}
]}
}
then struct
type Data struct {
A struct {
B []struct {
C int `json:"c"`
} `json:"b"`
} `json:"a"`
}
this sites (auto generate convert json to struct) may help you