登录
首页 >  Golang >  Go问答

解析 JSON 中的多值/单值数据

来源:stackoverflow

时间:2024-02-20 18:21:23 223浏览 收藏

今天golang学习网给大家带来了《解析 JSON 中的多值/单值数据》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~

问题内容

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

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

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"`
}

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


解决方案


您需要一个自定义解组器。我曾经讲过类似的情况in this video

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])
}

Playground link

通过 value 的定义,您的结构将变成如下所示:

type DocTypeFilter struct {
    Op    string `json:"op"`
    Field string `json:"field"`
    Value Value  `json:"value"`
}

现在您的 value 字段将始终是一个切片,但当您的 json 输入是字符串而不是数组时,它可能只包含单个值。

以上就是《解析 JSON 中的多值/单值数据》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>