我正在使用golang进行项目,并且需要使用JSON响应。问题是来自服务器的JSON中的值可能类似于
{person: "john"}
或
{person: {name:"john"}}
因此,要创建一个用于捕获此内容的结构,我有两个选择:
1)将人员类型设为接口{},但这以后将具有多余的代码以使用值
2)将值存储在新属性中,例如PersonAsString和PersonAsObject,这使代码更加难以预测,因为它打算用作其他开发人员的模块
还有其他利弊吗?还有其他建议如何处理未知类型的JSON字段?
答案 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
,它始终包含正确的值。