我正在使用一个端点(我不拥有并且无法修复),并且该端点返回JSON。
问题在于此JSON可以采用不同的格式:
格式1:
{
"message": "Message"
}
Run Code Online (Sandbox Code Playgroud)
要么
{
"message": ["ERROR_CODE"]
}
Run Code Online (Sandbox Code Playgroud)
取决于发生了什么。
我希望有一个结构来保存此响应,以便稍后可以检查messagea是字符串还是数组,并正确遵循流程。
在Go中可以做到吗?我认为的第一种方法是具有两个结构,并尝试使用解码string,如果发生错误,请尝试使用解码array。
有没有更优雅的方法?
将其解组为interface{}类型的值,然后使用类型断言或类型开关检查其最终值的类型。请注意,默认情况下,JSON数组未编组为type类型的值[]interface{},因此您必须检查该值以检测错误响应。
例如:
type Response struct {
Message interface{} `json:"message"`
}
func main() {
inputs := []string{
`{"message":"Message"}`,
`{"message":["ERROR_CODE"]}`,
}
for _, input := range inputs {
var r Response
if err := json.Unmarshal([]byte(input), &r); err != nil {
panic(err)
}
switch x := r.Message.(type) {
case string:
fmt.Println("Success, message:", x)
case []interface{}:
fmt.Println("Error, code:", x)
default:
fmt.Println("Something else:", x)
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出(在Go Playground上尝试):
Success, message: Message
Error, code: [ERROR_CODE]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
63 次 |
| 最近记录: |