Невозможно декодировать поле int из JSON - PullRequest
0 голосов
/ 13 января 2020

Моя цель - прочитать файл JSON. Хотя следующая программа прекрасно читает файл, значение поля id неверно. id значение поля 0 для всех прочитанных объектов.

Пример JSON содержимое файла:

{
  "users" : [
    {
      "id" : "1",
      "name" : "Matt Hayden"
    },
    {
      "id" : "2",
      "name" : "David Warner"
    },
  ]
 }

JSON программа для чтения файлов в Golang

 type Schema struct {
    Id int `json:"id"`
    Name string `json:"name"`

 }

 func reader() {
    fileName := "./input.json"

    jsonFile, fileErr := os.Open(fileName)
    if fileErr != nil {
        _ = errors.Errorf("failed to open file %s : %v", fileName, fileErr)
    }
    defer jsonFile.Close()

    bytesRead, readErr := ioutil.ReadAll(jsonFile)
    if readErr != nil {
        _ = errors.Errorf("failed to read json file %s : %v", fileName, readErr)
    }

    var sch Schema
    unMarshalErr := json.Unmarshal(bytesRead, &sch)
    if unMarshalErr != nil {
        _ = errors.Errorf("failed to unmarshal JSON bytes : %v", unMarshalErr)
    }

    fmt.Printf("%+v", sch)
 }

Фактический результат:

 {Users:[{Id:0 Name:Matt Hayden} {Id:0 Name:David Warner}]}

Ожидаемый результат:

 {Users:[{Id:1 Name:Matt Hayden} {Id:2 Name:David Warner}]}

1 Ответ

3 голосов
/ 13 января 2020

Вы можете добавить дополнительный тип в ваш JSON struct tag. Взгляните на документацию маршала здесь .

Пример: https://play.golang.org/p/VqZu9SrnpW4

package main

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

type Response struct {
    Users []User `json:"users"`
}

type User struct {
    ID   int    `json:"id,string"`
    Name string `json:"name"`
}

func main() {
    r := &Response{}

    err := json.Unmarshal([]byte(`{
  "users" : [
    {
      "id" : "1",
      "name" : "Matt Hayden"
    },
    {
      "id" : "2",
      "name" : "David Warner"
    }
  ]
 }`), &r)
    if err != nil {
        panic(err)
    }

    fmt.Printf("%#v \n", r)
    fmt.Printf("Type of ID is %s \n", reflect.TypeOf(r.Users[0].ID)) // int
}
...