JSON解组的嵌入式结构

问题描述 投票:4回答:4

我想解组到结构Outer定义为:

type Outer struct {
    Inner
    Num int
}

type Inner struct {
    Data string
}
func (i *Inner) UnmarshalJSON(data []byte) error {
    i.Data = string(data)
    return nil
}

使用json.Unmarshal(data, &Outer{})似乎只对使用InnerUnmarshalJSON并忽略Num领域:https://play.golang.org/p/WUBfzpheMl

我有一个笨拙solution,我手动设置Num领域,但我想知道是否有人有一个更清洁或更简单的方法来做到这一点。

谢谢!

json go unmarshalling
4个回答
4
投票

这是发生,因为Inner被嵌入在Outer。这意味着,当JSON库的调用上Outer unmarshaler,它不是结束调用它Inner

因此,内func (i *Inner) UnmarshalJSON(data []byte)data参数包含了整个JSON字符串,您正在然后Inner只处理。

您可以通过Inner明确的领域Outer解决这个问题

Outer struct {
    I Inner // make Inner an explicit field
    Num int `json:"Num"`
}

Working example


2
投票

你不应该需要一个解组功能

https://play.golang.org/p/-HZwX5-rPD

编辑:这是一个更完整的例子

https://play.golang.org/p/oz5kiwy3_K


0
投票

因为它在UnmarshalJSON的拆封使用,因为Outer内联在你的例子只是删除Inner。否则,你需要,如果你想要做的事习俗覆盖它。

https://play.golang.org/p/D6V6vKpx9J


0
投票

其实你并不需要明确的领域,你需要正确元帅/解组

例如:https://play.golang.org/p/mWPM7m44wfK

package main

import (
    "encoding/json"
    "fmt"
)

type Outer struct {
    Inner
    Num int `json:"Num"`
}

type Inner struct{ Data string }

type InnerRaw struct {Data string}

func (i *Inner) UnmarshalJSON(data []byte) error {
    ir:=&InnerRaw{}
    json.Unmarshal(data, ir)
    i.Data = ir.Data
    return nil
}

func main() {
    x := Outer{}
    data := []byte(`{"Num": 4, "Data":"234"}`)
    _ = json.Unmarshal(data, &x)
    fmt.Printf("%+v\n", x)
    js, _:=json.Marshal(x)
    fmt.Printf("JSON:%s", string(js))
}
© www.soinside.com 2019 - 2024. All rights reserved.