如何将两个 json 值解组到同一个变量中?

How to unmarshal two json values into same variable?

我经常遇到结构相同但名称不同的 json。如何将它们全部分配到同一个结构中。例如

{
    "e":"g"
    "a":[
        {
            "b":"b1",
            "c":"c1"
        }
        ]
}

{
    "e":"f"
    "d":[
        {
            "b":"b1",
            "c":"c1"
        }
        ]
}

具有相同的内部结构,但无法分解为相同的 golang 结构。

使用结构标签进行解码 json 适用于最常见的用例。对于自定义行为,实现 Unmarshaler 接口 (https://play.golang.org/p/rCpCDvWXGP):

type InnerStruct struct {
    B, C string
}
type OuterStruct struct {
    E string
    A []InnerStruct
}

func (o *OuterStruct) UnmarshalJSON(bs []byte) error {
    var intermediate map[string]json.RawMessage
    err := json.Unmarshal(bs, &intermediate)
    if err != nil {
        return err
    }
    // e is just e
    e, ok := intermediate["e"]
    if !ok {
        return fmt.Errorf("invalid json, expected `e`")
    }
    err = json.Unmarshal(e, &o.E)
    if err != nil {
        return err
    }
    // a is a or d
    a, ok := intermediate["a"]
    if !ok {
        a, ok = intermediate["d"]
    }
    if !ok {
        return fmt.Errorf("invalid json, expected `a` or `d`")
    }
    err = json.Unmarshal(a, &o.A)
    if err != nil {
        return err
    }
    return nil
}

在这种情况下,我使用了中间映射并延迟了内部值的处理以匹配 ad。我确定这不是您必须使用的实际数据,但希望它足以帮助您入门。