如何封送结构中的变量JSON响应



我正在使用一个API,当发生一些验证错误时,它会有一些稍微不同的响应。

成功响应:

{ 
"_status":"success",
"_data":{ 
"id":3901,
"name":"Customer",
"age":"30"
}
}

错误响应:

{ 
"_status":"error",
"_message":"Validation error",
"_data":[ 
{ 
"_field":"name",
"_error":"You must inform a name"
},
{ 
"_field":"age",
"_error":"Age must be over 50"
}
]
}

我已经在下面的结构中映射了错误响应,它在错误响应中运行良好,但在成功响应中失败。

type Response struct {
Status    string                  `json:"_status"`
Message *string                   `json:"_message"`
Data     []map[string]interface{} `json:"_data"`
}

有没有一种方法可以将结构添加到成功响应中?

使用json.RawMessage作为结构体数据字段的类型。根据评论,我为您的场景创建了一个示例程序,如下所示:

package main
import (
"encoding/json"
"fmt"
)
func main() {
type Response struct {
Status  string          `json:"_status"`
Message *string         `json:"_message"`
Data    json.RawMessage `json:"_data"`
}
var res Response
var err error
var data1 = []byte(`{ 
"_status":"success",
"_data":{ 
"id":3901,
"name":"Customer",
"age":"30"
}
}`)
var data2 = []byte(`{ 
"_status":"error",
"_message":"Validation error",
"_data":[ 
{ 
"_field":"name",
"_error":"You must inform a name"
},
{ 
"_field":"age",
"_error":"Age must be over 50"
}
]
}`)
err = json.Unmarshal(data1, &res)
if err != nil {
fmt.Println("--------", err)
}
fmt.Printf("%sn", res)
err = json.Unmarshal(data2, &res)
if err != nil {
fmt.Println("--------", err)
}
fmt.Printf("%sn", res)
}

输出:

{success %!s(*string=<nil>) { 
"id":3901,
"name":"Customer",
"age":"30"
}}
{error %!s(*string=0xc00009e340) [ 
{ 
"_field":"name",
"_error":"You must inform a name"
},
{ 
"_field":"age",
"_error":"Age must be over 50"
}
]}

最新更新