猿问

如何在 Json 中解码多/单值

我想解码一个请求 JSON,一个字段的值可以是单个字符串或数组(列表)。


我知道如何单独解析。但我正在寻找一种方法来使用动态解码器来解析它们。


JSON中的value字段就是我正在谈论的情况


单值示例:


{

    "filter":{

        "op":"IN",

        "field":"name",

        "value": "testDuplicate"

    }

}

多值示例:


{

    "filter":{

        "op":"IN",

        "field":"name",

        "value":["testDuplicate","tt"]

    }

}

单值结构:


type DocumentTypeSearchRequest struct {

    Filter   DocTypeFilter `json:"filter"`

}

type DocTypeFilter struct {

    Op    string `json:"op"`

    Field string `json:"field"`

    Value string `json:"value"`

}

多值结构:


type DocumentTypeSearchRequest struct {

    Filter   DocTypeFilter `json:"filter"`

}

type DocTypeFilter struct {

    Op    string `json:"op"`

    Field string `json:"field"`

    Value []string `json:"value"`

}  

一种解决方案是尝试在其中一个解码失败时使用另一个解码,但我不确定这是否是处理此问题的正确方法。


MYYA
浏览 92回答 1
1回答

守着一只汪

您需要一个自定义解组器。我在这个视频中谈到了类似的情况:type Value []stringfunc (v *Value) UnmarshalJSON(p []byte) error {    if p[0] == '[' { // First char is '[', so it's a JSON array        s := make([]string, 0)        err := json.Unmarshal(p, &s)        *v = Value(s)        return err    }    // else it's a simple string    *v = make(Value, 1)    return json.Unmarshal(p, &(*v)[0])}使用 的这个定义Value,你的结构会变成这样:type DocTypeFilter struct {    Op    string `json:"op"`    Field string `json:"field"`    Value Value  `json:"value"`}现在您的Value字段将始终是一个切片,但是当您的 JSON 输入是字符串而不是数组时,它可能只包含一个值。
随时随地看视频慕课网APP

相关分类

Go
我要回答