Как распаковать эту строку JSON - PullRequest
1 голос
/ 19 апреля 2019

У меня проблемы с чтением этого типа json.

["Msg",{"cmd":"ack","id":"B81DA375B6C4AA49D262","ack":2,"from":"18094158994@c.us","to":"18099897215@c.us","t":1555446115}]

Я пытаюсь со многими библиотеками.

type SEND struct {
    Mgs string `json:"Msg"`
    //SEND MSG
}

type MSG struct {
    CMD  string `json:"cmd"`
    ID   string `json:"id"`
    ACK  int    `json:"ack"`
    FROM string `json:"from"`
    TO   string `json:"to"`
    T    int64  `json:"t"`
}

func main() {
    data := `["Msg",{"cmd":"ack","id":"B81DA375B6C4AA49D262","ack":2,"from":"18094158994@c.us","to":"18099897215@c.us","t":1555446115}] `
    var dd SEND
    err := json.Valid([]byte(data))
    fmt.Println("Is valid XML?->", err)
    json.Unmarshal([]byte(data), &dd)
    fmt.Println("1", dd)
    fmt.Println("2", dd.Mgs)

}

Аль всегда получает пустой и JSON это действительно

Is valid XML?-> true
1 {}
2 EMPTY

1 Ответ

3 голосов
/ 19 апреля 2019

В этом случае у вас есть массив с string и object в вашем json, поэтому вы должны использовать interface{} на стороне golang, должно быть что-то вроде:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    data := `["Msg",{"cmd":"ack","id":"B81DA375B6C4AA49D262","ack":2,"from":"18094158994@c.us","to":"18099897215@c.us","t":1555446115}] `
    var d []interface{}
    err := json.Unmarshal([]byte(data), &d)
    fmt.Printf("err: %v \n", err)
    fmt.Printf("d: %#v \n", d[0])
    fmt.Printf("d: %#v \n", d[1])
}

Результат будет выглядеть так:

err: <nil>
d: "Msg"
d: map[string]interface {}{"id":"B81DA375B6C4AA49D262", "ack":2, "from":"18094158994@c.us", "to":"18099897215@c.us", "t":1.555446115e+09, "cmd":"ack"}

Итак, 1-й элемент в срезе d это строка Msg,
и 2-й элемент в срезе - карта map[string]interface {} и теперь вы можете сделать что-то еще с этой картой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...