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

时间:2015-08-01 11:54:18

标签: go unmarshalling

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

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

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

具有相同的内部结构,但不能被解组为相同的golang结构。

1 个答案:

答案 0 :(得分:2)

使用struct标签解码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。我确定这不是您必须使用的实际数据,但希望它足以让您入门。