Go 将匿名json字段解组为";命名为;领域

Go 将匿名json字段解组为";命名为;领域,go,Go,假设我有以下json { "unknown": { "knownArray": [ {"property": "somevalue", "otherproperty": false} ], "otherKnownArray": [""] } } 我有下面的结构来表示这些数据 type Model struct { ObjectName string KnownArray []KnownTyp

假设我有以下json

{
    "unknown": {
        "knownArray": [
            {"property": "somevalue", "otherproperty": false}
        ],
        "otherKnownArray": [""]
    }
}
我有下面的结构来表示这些数据

type Model struct {
    ObjectName string
    KnownArray []KnownType `json:"knownArray"`
    OtherKnownArray []string `json:"otherKnownArray"`
}

type KnownType struct {
    Property string `json:"property1"`
    Otherproperty bool   `json:"otherproperty"`
}

不反序列化任何json

如何正确反序列化到我的模型?
如何反序列化json以使ObjectName=“unknown”?

谈到匿名json字段,我不太了解encoding/json的内部结构


我还尝试将模型包装到第三个“外部”模型中,但仍然无法处理匿名json字段。

可以使用map[string]模型进行编码

主程序包
进口(
“fmt”
“编码/json”
)
类型模型结构{
对象名称字符串
KnownArray[]KnownType`json:“KnownArray”`
OtherKnownArray[]字符串`json:“OtherKnownArray”`
}
类型KnownType结构{
属性字符串`json:“属性”`
Otherproperty bool`json:“Otherproperty”`
}
func main(){
jsonstring:=`{
“未知”:{
“knownArray”:[
{“property”:“somevalue”,“otherproperty”:false}
],
“otherKnownArray”:[“”]
}
}`
a:=make(映射[字符串]模型)
Unmarshal([]字节(jsonstring),&a)
var-m模型
对于k,v:=范围(a){
m=v
m、 ObjectName=k
打破
}
fmt.Println(m.ObjectName、m.KnownArray、m.OtherKnownArray)
}

可以使用map[string]模型进行编码

主程序包
进口(
“fmt”
“编码/json”
)
类型模型结构{
对象名称字符串
KnownArray[]KnownType`json:“KnownArray”`
OtherKnownArray[]字符串`json:“OtherKnownArray”`
}
类型KnownType结构{
属性字符串`json:“属性”`
Otherproperty bool`json:“Otherproperty”`
}
func main(){
jsonstring:=`{
“未知”:{
“knownArray”:[
{“property”:“somevalue”,“otherproperty”:false}
],
“otherKnownArray”:[“”]
}
}`
a:=make(映射[字符串]模型)
Unmarshal([]字节(jsonstring),&a)
var-m模型
对于k,v:=范围(a){
m=v
m、 ObjectName=k
打破
}
fmt.Println(m.ObjectName、m.KnownArray、m.OtherKnownArray)
}

使用
map[string]*Model
,然后在地图上移动范围并使用键设置ObjectName。使用
map[string]*Model
,然后在地图上移动范围并使用键设置ObjectName。这回答了一半的问题,太棒了!我现在是100%更远了。但是属性“ObjectName”呢?还是我只是在事实发生后分配它?@VisualBean,我更新了答案。是的,你只需给它分配一半的答案,太棒了!我现在是100%更远了。但是属性“ObjectName”呢?还是我只是在事实发生后分配它?@VisualBean,我更新了答案。是的,你只需要分配它
var model Model

json.Unmarshal(content, &model)