【问题标题】:Unable to decode int field from JSON无法从 JSON 解码 int 字段
【发布时间】:2020-04-29 17:27:47
【问题描述】:

我的目标是读取 JSON 文件。尽管以下程序可以正常读取文件,但 id 字段值不正确。对于所有读取的对象,id 字段值为 0

示例 JSON 文件内容:

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

Golang 中的 JSON 文件阅读器程序

 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}]}

【问题讨论】:

  • 我不知道去,但 JSON 中的数字没有字符串文字 - 这可能是你的错误。
  • 就是这样。也是马特·海登 ;)
  • 还要确保键名一致:id != Id
  • @JoshSharkey 没有必要——在 Go 中,对于 JSON 和它们编组的结构有不同的情况是正常的。该字段旁边的注释告诉 Go 如何编组/解组 JSON。
  • 除了 JSON very much 区分大小写,所以如果 Go 自动将 Id 解析为 id,那真的很糟糕,人们会特别期待对于 JSON 解析,这种分辨率不会起作用,因为如果这样做会很荒谬。 a = { id: 3, Id: 4 } 既是有效的 JS,又是有效的 JSON {"id": 4, "Id": 5}

标签: json go decode


【解决方案1】:

您可以在 JSON 结构标记中添加额外的类型。查看 Marshal 文档here

示例: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
}

【讨论】:

    猜你喜欢
    • 2022-07-29
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多