如何将两个 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
}
在这种情况下,我使用了中间映射并延迟了内部值的处理以匹配 a
或 d
。我确定这不是您必须使用的实际数据,但希望它足以帮助您入门。
我经常遇到结构相同但名称不同的 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
}
在这种情况下,我使用了中间映射并延迟了内部值的处理以匹配 a
或 d
。我确定这不是您必须使用的实际数据,但希望它足以帮助您入门。