【问题标题】:How to unmarshal JSON with unknown fieldnames to struct [duplicate]如何将具有未知字段名的 JSON 解组为结构 [重复]
【发布时间】:2018-03-19 12:10:41
【问题描述】:

是否可以解组具有未知字段的 JSON?该字段名称始终不同,但结构相同。 JSON 是 POST 请求的结果。

我的代码:

package main

import "fmt"
import "encoding/json"

var body = []byte(`{
    "unknown_field": {
            "known_field_1": [[1,2,3,4,5],[10,20,30,40,50],[100,200,300,400,500]],
            "known_field_2": [[11,21,31,41,51]],
            "known_field_3": [[12,22,32,42,52],[14,44,34,44,54]]
        }
}`)

type MyStruct struct {
    MainData map[string]mData `json:"-"`
}

type mData struct {
    knownField1 [][5]int `json:"known_field_1"`
    knownField2 [][5]int `json:"known_field_2"`
    knownField3 [][5]int `json:"known_field_3"`
}

func NewMyStruct() MyStruct {
    ms := MyStruct{}
    ms.MainData = make(map[string]mData)
    return ms
}

func main() {
    myStruct := NewMyStruct()
    if err := json.Unmarshal(body, &myStruct); err != nil {
        panic(err)
    }

    fmt.Println(myStruct) // gives {map[]}
}

【问题讨论】:

    标签: json go


    【解决方案1】:

    不知道key的情况下直接使用map,map的值类型可能是描述结构的struct:

    type mData struct {
        KnownField1 [][5]int `json:"known_field_1"`
        KnownField2 [][5]int `json:"known_field_2"`
        KnownField3 [][5]int `json:"known_field_3"`
    }
    

    请注意,您必须导出字段才能使用!

    以及解组代码:

    var data map[string]mData
    if err := json.Unmarshal(body, &data); err != nil {
        panic(err)
    }
    
    fmt.Println(data)
    for k, v := range data {
        fmt.Println(k, v)
    }
    

    输出(在Go Playground)上试试:

    map[unknown_field:{[[1 2 3 4 5] [10 20 30 40 50] [100 200 300 400 500]] [[11 21 31 41 51]] [[12 22 32 42 52] [14 44 34 44 54]]}]
    unknown_field {[[1 2 3 4 5] [10 20 30 40 50] [100 200 300 400 500]] [[11 21 31 41 51]] [[12 22 32 42 52] [14 44 34 44 54]]}
    

    查看相关问题:

    How to parse/deserlize a dynamic JSON in Golang

    Unmarshal JSON with unknown fields

    Unmarshal json string to a struct that have one element of the struct itself

    JSON Nested dynamic structures Go decoding

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-09
      • 2017-03-18
      • 2023-01-10
      • 2020-10-14
      • 2019-03-28
      相关资源
      最近更新 更多