解组json时处理不同类型

Luc*_*ier 2 json decode go

我正在使用一个端点(我不拥有并且无法修复),并且该端点返回JSON。

问题在于此JSON可以采用不同的格式:

格式1:

{
  "message": "Message"
}
Run Code Online (Sandbox Code Playgroud)

要么

{
  "message": ["ERROR_CODE"]
}
Run Code Online (Sandbox Code Playgroud)

取决于发生了什么。

我希望有一个结构来保存此响应,以便稍后可以检查messagea是字符串还是数组,并正确遵循流程。

在Go中可以做到吗?我认为的第一种方法是具有两个结构,并尝试使用解码string,如果发生错误,请尝试使用解码array

有没有更优雅的方法?

icz*_*cza 6

将其解组为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)