topas topas - 1 month ago 6
JSON Question

Golang Unmarshal JSON

My input JSON, has a list of different elements.

I have problems with the number of the first element of response.

Simplified example:

package main

import (
"fmt"
"log"
"encoding/json"
)

var j = ` {
"response": [
777, // problem here !!!
{
"id": 888,
"from_id": 999,
"to_id": 888,
"text": "hello..."
},
{
"id": 999,
"from_id": 888,
"to_id": 999,
"text": "goodbye..."
}
]
}`

type D struct {
Id int `json:"id"`
FromId int `json:"from_id"`
ToId int `json:"to_id"`
Text string `json:"text"`
}

type R struct {
Count int //
Response []D `json:"response"`
}

func main() {
var data = new(R)
err := json.Unmarshal([]byte(j), &data)
if err != nil {
log.Fatal(err)
}
fmt.Println(data.Response)
}


Error on output. I do not understand where the error. Help me please.




Edit:

The original JSON:

https://api.vk.com/method/wall.get?owner_id=1&count=1

Amd Amd
Answer

1- Here is the working code,try it on The Go Playground:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    var d *R
    err := json.Unmarshal([]byte(str), &d)
    if err != nil {
        panic(err)
    }
    var data R2
    data.Count = int(d.Response[0].(float64))

    for _, v := range d.Response[1:] {    
        bs, err := json.Marshal(v)
        if err != nil {
            panic(err)
        }
        var d1 *D
        err = json.Unmarshal(bs, &d1)
        if err != nil {
            panic(err)
        }
        data.Response = append(data.Response, *d1)
    }
    fmt.Println(data)    
}

type R struct {
    Response []interface{} `json:"response"`
}

var str = ` {
  "response": [
    777,  
    {
      "id": 888,
      "from_id": 999,
      "to_id": 888,
      "text": "hello"
    },
        {
      "id": 999,
      "from_id": 888,
      "to_id": 999,
            "text": "goodbye"
    }
  ]
}`

type D struct {
    Id     int    `json:"id"`
    FromId int    `json:"from_id"`
    ToId   int    `json:"to_id"`
    Text   string `json:"text"`
}
type R2 struct {
    Count    int
    Response []D
}

output:

{777 [{888 999 888 hello} {999 888 999 goodbye}]}
Comments