Разбор JSON с использованием структуры - PullRequest
0 голосов
/ 22 февраля 2020

Я пытаюсь разобрать JSON, используя Go. Может кто-нибудь сказать мне, почему мой код не работает, как ожидалось?

package main

import (
    "encoding/json"
    "fmt"
)
type Message struct {
    Name string
    Body string
    Time int64
}

type Person struct {
    M Message
}

func get_content() {

    body := []byte(`{"person":{"Name":"Alice","Body":"Hello","Time":1294706395881547000}}`)

    var data Person
    err := json.Unmarshal(body, &data)
    if err != nil {
        panic(err.Error())
    }
    fmt.Printf("%v",data.M.Name)

}

func main() {
    get_content()
}

Я ожидаю, что это напечатает Имя.

Go Код детской площадки

Ответы [ 3 ]

1 голос
/ 22 февраля 2020

В коде есть две проблемы.

Первая - это то, что @ umar-hayat упомянул выше -> вы демонтируете объект data, и вы должны стремиться к полю data.M .

Вторая проблема заключается в том, что структура вашего JSON не соответствует структуре вашей структуры. Ваш Person имеет одно поле с именем M. Если мы хотим представить это как JSON, это будет выглядеть так:

{
  "M": {
    "Name": "Joe",
    "Body": "Hi",
    "time": 2600
  }
}

Вместо этого у вас есть поле с именем person в вашем JSON, которое не может быть сопоставлено ни с одним полем в вашей структуре , Боюсь, тот факт, что оно похоже на название типа структуры, никак не помогает.

Итак, вы можете изменить JSON и цель:

    body := []byte(`{"Name":"Alice","Body":"Hello","Time":1294706395881547000}`)

    var data Person
    err := json.Unmarshal(body, &data.M)

Или просто ваш JSON:

    body := []byte(`{"M":{"Name":"Alice","Body":"Hello","Time":1294706395881547000}}`)

    var data Person
    err := json.Unmarshal(body, &data)

Но важно, чтобы имена полей в вашем JSON совпадали с именами полей в вашей структуре. Или, как упомянул Konstantinos, вы можете использовать теги для указания конкретных имен, с которыми поля вашей структуры будут представлены в JSON.

. Возможно, вы найдете это полезным: https://gobyexample.com/json

1 голос
/ 22 февраля 2020

Вот как Unmarshel JSON к структуре. Вы можете проверить это на Go Детская площадка здесь :

package main

import (
    "encoding/json"
    "fmt"
)
type Message struct {
    Name string
    Body string
    Time int64
}

type Person struct {
    M Message
}

func get_content() {

    body := []byte(`{"Name":"Alice","Body":"Hello","Time":1294706395881547000}`)

    var data Person

    err := json.Unmarshal(body, &data.M)

    if err != nil {
        panic(err.Error())
    }
    fmt.Printf(data.M.Name)

}

func main() {
    get_content()
}

Замените data на data.M в строке ниже.

err := json.Unmarshal(body, &data)

0 голосов
/ 22 февраля 2020

Пока вы намереваетесь отобразить Json ключи на структурах, поля которых имеют разные имена, вы должны добавить теги:

    type Message struct {
        Name string `json:"Name"`
        Body string `json:"Body"`
        Time int64  `json:"Time"`
    }

    type Person struct {
        M Message `json:"person"`
    }

Более подробную информацию можно найти здесь

Кроме того этот ответ в двух словах объясняет назначение тегов в go.

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