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

如何在golang或一般类型化语言中处理JSON响应中的不同类型,json,go,Json,Go,我在golang从事一个项目,需要使用JSON响应。问题是,来自服务器的JSON中的值可以是 {person: "john"} 或 因此,要创建一个用于捕获此信息的结构,我有两个选项: 1) 将person类型设为接口{},但稍后将有多余的代码来处理该值 2) 将值存储在新属性中,如PersonAsString和PersonAsObject,这使得代码更不可预测,因为它将用作其他开发人员的模块 还有其他的赞成和反对意见吗?如何处理未知类型的JSON字段还有其他建议吗?在这种情况下,您必须使用

我在golang从事一个项目,需要使用JSON响应。问题是,来自服务器的JSON中的值可以是

{person: "john"} 

因此,要创建一个用于捕获此信息的结构,我有两个选项:

1) 将person类型设为接口{},但稍后将有多余的代码来处理该值

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


还有其他的赞成和反对意见吗?如何处理未知类型的JSON字段还有其他建议吗?

在这种情况下,您必须使用
接口{}

但为了降低结构的复杂性,您可以使用一个额外的字段,如
NameValue
,并在
json.Unmarshal
之后填充此值,然后从
person.name
分配值或从
person
分配值。

在代码中,您可以松散地使用
NameValue
,它始终包含正确的值。

另一个选项是使用自定义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响应,您只能使用
接口{}
。这个答案可能有助于如何使用类型断言从接口获取值。这看起来很有希望。
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)
}