使用未知密钥的Unmarshall JSON上的空结构

时间:2019-11-29 12:53:38

标签: json go struct unmarshalling

我正在从API获取JSON,如下所示:

{
  "unknownkey" : {
    "sum" : 7030.76636,
    "low" : 6787.05692,
    "avg" : 0.00014
  }
}

第一个键是未知的-它会更改,但是内部的结构始终保持相同的键。 在讨论here之后,我创建了以下structs

type Order struct {
  Result Result `json:"-"`
}

type Result struct {
  Sum        float64    `json:"sum"`
  Low        float64    `json:"low"`
  Avg        float64      `json:"avg"`
}

我尝试像这样取消编组:

var order Order
json.Unmarshal([]byte(body), &order)

但我只是得到一个空结构:

{Result:{Sum:0 Low:0 Avg:0}}

1 个答案:

答案 0 :(得分:3)

您可以使用值类型为Result*Result的地图:

var wrapper map[string]Result

if err := json.Unmarshal([]byte(body), &wrapper); err != nil {
    panic(err)
}

fmt.Printf("%+v\n", wrapper)

这将导致:

map[unknownkey:{Sum:7030.76636 Low:6787.05692 Avg:0.00014}]

如果您需要Result对象,请在地图上进行调整:

for key, result := range wrapper {
    fmt.Printf("Key: %q, Result: %+v", key, result)
}

这将输出:

Key: "unknownkey", Result: {Sum:7030.76636 Low:6787.05692 Avg:0.00014}

Go Playground上尝试示例。