为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Json 中解码多/单值

如何在 Json 中解码多/单值

Go
MYYA 2022-07-18 16:40:23
我想解码一个请求 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"`}  一种解决方案是尝试在其中一个解码失败时使用另一个解码,但我不确定这是否是处理此问题的正确方法。
查看完整描述

1 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

您需要一个自定义解组器。我在这个视频中谈到了类似的情况:


type Value []string


func (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 输入是字符串而不是数组时,它可能只包含一个值。


查看完整回答
反对 回复 2022-07-18
  • 1 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信