Что происходит, когда мы демонтируем пустой Json в struct на golang? - PullRequest
0 голосов
/ 12 июля 2019

У меня проблема с анализом пустой строки JSON в структуре в Golang. На детской площадке, когда я запускаю этот код, функция маршала возвращает unexpected end of JSON input. Но является ли это официальным возвратом Голанга, когда мы анализируем пустую строку JSON в структуре?

package main

import (
    "encoding/json"
    "fmt"
)

var respBytes = []byte{}

type ResultStruct struct {
    result []map[string]string
}

func main() {
    var jsonData ResultStruct
    err := json.Unmarshal(respBytes, &jsonData)
    fmt.Println(err)

}

Ответы [ 2 ]

1 голос
/ 12 июля 2019

Вы должны использовать var respBytes = []byte(``) ИЛИ var respBytes = []byte(`{}`)

Теперь ваш вопрос, если мы удалим пустой json в struct, тогда он просто пропустит это.

Следующий код просто оставляет jsonData ResultStruct со значениями инициализации:

var jsonData ResultStruct
err := json.Unmarshal([]byte(`{}`), &jsonData)
fmt.Println(err)
fmt.Println(jsonData)

Теперь только при инициализации по умолчанию также будет напечатано то же самое:

var jsonData ResultStruct   
fmt.Println(jsonData)

Единственный способпроверить, не был ли unmarshal успешным (или значимым), использовать тип указателя .По умолчанию указатели равны нулю (или при инициализации).Если данные в них правильно распакованы, они будут указывать на правильное значение, иначе они останутся равными нулю.Вы можете использовать это и использовать nil check для указателя как if jsonData.Result == nil {}.

package main

import (
    "encoding/json"
    "fmt"
)

type ResultStruct struct {
    Result *[]map[string]string `json:"result"`
}

    func main() {
        //case 1
        var jsonData1 ResultStruct        
        err := json.Unmarshal([]byte(`{"result":[{"Name":"ADF","Job":"ENG"},{"Name":"ASK","Job":"TEST"}]}`), &jsonData1)
        fmt.Println(err)
        fmt.Println(jsonData1.Result)

        fmt.Println()

        //case 2
        var jsonData2 ResultStruct        
        err = json.Unmarshal([]byte(`{}`), &jsonData1)
        fmt.Println(err)
        fmt.Println(jsonData2.Result)

    }

В приведенном выше случае 2 мы можем проверить, имеет ли jsonData2.Result значение nil.Если это ноль, это означает, что Unmarshal не удалось получить результаты

1 голос
/ 12 июля 2019

Для этой строки: var respBytes = []byte{} Вы создали пустой фрагмент байта.Который json.Unmarshal doc не будет анализировать его должным образом.Потому что Empty не является допустимой строкой JSON.

Это способ демарширования «пустой» строки JSON:

var respBytes = []byte(`{}`)

Пример Go JSON

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