Go 试图获得“的价值”;总数;来自JSON响应

Go 试图获得“的价值”;总数;来自JSON响应,go,struct,pretty-print,Go,Struct,Pretty Print,响应: { “元”:{ “查询时间”:0.039130201, “分页”:{ “偏移量”:1345, “限额”:5000, “总计”:1345 }, 结构: 类型InLicense结构{ Total int16json:“Total,省略empty” } 键入大纲许可证结构{ 分页[]InLicensejson:“分页,省略空” } 类型MetaLicense结构{ Meta[]大纲许可json:“Meta,省略空” } 代码剪切内部函数: req,err:=http.NewRequest(“G

响应:

{
“元”:{
“查询时间”:0.039130201,
“分页”:{
“偏移量”:1345,
“限额”:5000,
“总计”:1345 },

结构:

类型InLicense结构{
Total int16
json:“Total,省略empty”

}

键入大纲许可证结构{
分页[]InLicense
json:“分页,省略空”

}

类型MetaLicense结构{
Meta[]大纲许可
json:“Meta,省略空”

}

代码剪切内部函数:

req,err:=http.NewRequest(“GET”,nil)
如果错误!=nil{
//处理错误
}

客户端:=&http.client{}
resp,err:=client.Do(req)
如果错误!=nil{
log.Println(“错误:”,err)
}
延迟响应主体关闭()
val:=&MetaLicense{}

err = json.NewDecoder(resp.Body).Decode(&val)
if err != nil {
    log.Fatal(err)
}

for _, s := range val.Meta {
    for _, a := range s.Pagination {
        fmt.Println(a.Total)
    }

}
}

运行此代码后,出现以下错误: json:无法将对象解组到Go结构字段MetaLicense.meta中,类型为[]OutLicense


[]OutLicense需要哪种类型才能正确地取消签名?我无法以另一种方式打印它,但它使用{}和字符串打印。修剪将不起作用。

您应该使用实际类型的简单字段声明,而不是像下面那样使用类型的
[]

type InLicense struct {
    Total int16 json:"total,omitempty"
}

type OutLicense struct {
     Pagination InLicense json:"pagination,omitempty"
}

type MetaLicense struct {
    Meta OutLicense json:"meta,omitempty"
}

您应该只使用具有实际类型的简单字段声明,而不是该类型的
[]
,如下所示:

type InLicense struct {
    Total int16 json:"total,omitempty"
}

type OutLicense struct {
     Pagination InLicense json:"pagination,omitempty"
}

type MetaLicense struct {
    Meta OutLicense json:"meta,omitempty"
}

我稍微简化了解析,只使用了
json.Unmarshal()
函数

raw := "{\n  \"meta\": {\n    \"query_time\": 0.039130201,\n    \"pagination\": {\n      \"offset\": 1345,\n      \"limit\": 5000,\n      \"total\": 1345\n    }\n  }\n}"

parsed := &MetaLicense{}
err := json.Unmarshal([]byte(raw), parsed)
if err != nil {
    log.Fatal(err)
}

fmt.Println(parsed.Meta.Pagination.Total) // Prints: 1345
这是我使用的类型

type InLicense struct {
    Total int16 `json:"total,omitempty"`
}

type OutLicense struct {
    Pagination InLicense `json:"pagination,omitempty"`
}

type MetaLicense struct {
    Meta OutLicense `json:"meta,omitempty"`
}
如前所述,您提供的JSON有一个额外的
,这使得您的JSON不可解析(假设您也添加了缺少的
}

JSON中没有列表。列表用
[]
符号表示。要让您的类型使用它,JSON必须如下所示:

{
  "meta": [{
    "query_time": 0.039130201,
    "pagination": [{
      "offset": 1345,
      "limit": 5000,
      "total": 1345
    }]
  }]
}

我稍微简化了解析,只使用了
json.Unmarshal()
函数

raw := "{\n  \"meta\": {\n    \"query_time\": 0.039130201,\n    \"pagination\": {\n      \"offset\": 1345,\n      \"limit\": 5000,\n      \"total\": 1345\n    }\n  }\n}"

parsed := &MetaLicense{}
err := json.Unmarshal([]byte(raw), parsed)
if err != nil {
    log.Fatal(err)
}

fmt.Println(parsed.Meta.Pagination.Total) // Prints: 1345
这是我使用的类型

type InLicense struct {
    Total int16 `json:"total,omitempty"`
}

type OutLicense struct {
    Pagination InLicense `json:"pagination,omitempty"`
}

type MetaLicense struct {
    Meta OutLicense `json:"meta,omitempty"`
}
如前所述,您提供的JSON有一个额外的
,这使得您的JSON不可解析(假设您也添加了缺少的
}

JSON中没有列表。列表用
[]
符号表示。要让您的类型使用它,JSON必须如下所示:

{
  "meta": [{
    "query_time": 0.039130201,
    "pagination": [{
      "offset": 1345,
      "limit": 5000,
      "total": 1345
    }]
  }]
}

感谢您的快速响应。我试过了,但当我这样做时,我将无法覆盖val.Meta,因为它不是一个切片。@ioj您提供的JSON示例不包含JSON数组,因此它中的任何内容都无法被解组到切片中,这就是为什么您的代码无法工作的原因。如果您应用我建议的更改并删除该范围通过val.Meta,它将按预期工作。这解决了我的问题。我最初打印它的方式非常混乱,这简化了事情。感谢您的快速响应。我尝试了,但当我这样做时,我将无法覆盖val.Meta,因为它不是一个切片。@ioj您提供的JSON示例不包含JSON数组,所以它中的任何内容都无法解组到切片中,这就是为什么您的代码无法工作。如果您应用我建议的更改并删除val上的范围。Meta将按预期工作。这解决了我的问题。我原来打印它的方式非常混乱,这简化了事情。感谢这些信息,接下来我将使用同时,您还帮助我了解了如何在不使用字符串的情况下删除“{}”。Trim!干杯。感谢您提供的信息,我将继续使用unmarshal方法。此外,您还帮助我了解了如何在不使用字符串的情况下删除“{}”。Trim!干杯。