将多个JSON类型解析为相同的结构 [英] Parsing multiple JSON types into the same struct

查看:100
本文介绍了将多个JSON类型解析为相同的结构的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在请求一个API,该API返回包含对象数组的JSON.问题在于对象可以采用两种形式.它们可以是字符串或对象.结果示例如下:

I am requesting an API which returns JSON containing an array of objects. The problem is that the objects can take two forms. They can either be a string or an object. An example result could look like this:

[
    {"name": "obj1", "key2": ["a", "b"]},
    "obj2",
    {"name": "obj3"}
]

字符串元素"objX" 等效于 {"name":"objX"} .

我想将其解析为以下类型的切片:

I want to parse this into a slice of the following type:

type Obj struct {
    Name string
    Key2 []string
}

我该如何以合理的方式做到这一点?

How do I do this in a reasonable fashion?

推荐答案

package main

import (
    "encoding/json"
    "fmt"
)

type Obj struct {
    Name string   `json:"name"`
    Key2 []string `json:"key2"`
}

func (o *Obj) UnmarshalJSON(b []byte) error {
    var name string
    if err := json.Unmarshal(b, &name); err == nil {
        *o = Obj{}
        o.Name = name
        return nil
    }

    type Obj2 Obj
    var o2 Obj2
    if err := json.Unmarshal(b, &o2); err != nil {
        return err
    }
    *o = Obj(o2)
    return nil
}

const payload = `[
    {"name": "obj1", "key2": ["a", "b"]},
    "obj2",
    {"name": "obj3"}
]
`

func main() {
    var objs []*Obj
    if err := json.Unmarshal([]byte(payload), &objs); err != nil {
        panic(err)
    }
    for _, obj := range objs {
        fmt.Printf("Name:%v, Key2:%v\n", obj.Name, obj.Key2)
    }
}

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

这篇关于将多个JSON类型解析为相同的结构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆