一般如何在Golang或键入的语言中处理JSON响应中的不同类型

时间:2018-07-03 10:00:59

标签: json go

我正在使用golang进行项目,并且需要使用JSON响应。问题是来自服务器的JSON中的值可能类似于

{person: "john"} 

{person: {name:"john"}} 

因此,要创建一个用于捕获此内容的结构,我有两个选择:

1)将人员类型设为接口{},但这以后将具有多余的代码以使用值

2)将值存储在新属性中,例如PersonAsString和PersonAsObject,这使代码更加难以预测,因为它打算用作其他开发人员的模块

还有其他利弊吗?还有其他建议如何处理未知类型的JSON字段?

2 个答案:

答案 0 :(得分:3)

另一种选择是使用自定义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)
}

答案 1 :(得分:0)

在这种情况下,您必须使用interface{}
但是为了降低结构的复杂性,您可以有一个附加字段,如NameValue,并在json.Unmarshal之后填充此值,然后从{{1 }}。
在您的代码中,您可以松散地使用person,它始终包含正确的值。