json - 如何在 golang 或一般类型语言中处理 JSON 响应中的不同类型

标签 json go

我正在使用 golang 开发一个项目,我需要使用 JSON 响应。问题是来自服务器的 JSON 中的值可以类似于

{person: "john"} 

{person: {name:"john"}} 

所以要创建一个结构来捕获它,我有几个选择:

1) 将 person type 设置为 interface{},但这将在以后使用冗余代码来处理该值

2) 将值存储在新属性中,例如 PersonAsString 和 PersonAsObject,这使得代码更加不可预测,因为它意味着要用作其他开发人员的模块

还有其他优点和缺点吗?还有其他关于如何处理未知类型 JSON 字段的建议吗?

最佳答案

另一种选择是使用自定义 JSON 编码和解码函数定义类型。

type Person string

func (p *Person) UnmarshalJSON(b []byte) error {
    if strings.HasPrefix(string(*p),"{"){
        value := map[string]string{}
        json.Unmarshal(b,&value)
        *p = Person(value["name"])
    }else{
        *p = Person(b)
    }
    return nil
}

func (p Person) MarshalJSON() ([]byte, error) {
    return []byte(p),nil
}


type PersonStruct struct{
    Person  Person `json:"person"`
}

func main(){
    one := `{"person": "john"}`
    two := `{"person": {name:"john"}}`
    result := PersonStruct{}
    json.Unmarshal([]byte(one),&result)
    fmt.Println(result)
    json.Unmarshal([]byte(two),&result)
    fmt.Println(result)
}

关于json - 如何在 golang 或一般类型语言中处理 JSON 响应中的不同类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51151729/

相关文章:

java - 如何在 Java 规范中添加子查询

java - 如何使用 Apache Camel 处理大的 JSON 数组

go - 如何在 Golang 中转储结构的方法?

c - Go中的递归链表类型别名

go - 在 Go 中计算 hashCode

java - ResultSet getArray 函数不起作用?

json - 如何保证 Swift 4 中的有效 JSON?

javascript - BodyParser 行为

variables - 短声明运算符隐藏全局变量

Golang 模板 - 使用模板变量作为范围循环内的全局变量