当前位置: 首页 > 知识库问答 >
问题:

JSON键可以是字符串或对象

曹乐意
2023-03-14

我想解析一些JSON,但一个键要么是字符串,要么是对象。

这是我当前的结构:https://github.com/PhillippOhlandt/pmtoapib/blob/master/CollectionItemRequest.go#L10

type CollectionItemRequest struct {
    Url         string          `json:"url"`
    Method      string          `json:"method"`
    Header      []RequestHeader `json:"header"`
    Body        RequestBody     `json:"body"`
    Description string          `json:"description"`
}

在这里,“Url”属性不仅可以是字符串,还可以是对象。

我开始为它创建一个自己的结构,覆盖对象案例。

type CollectionItemRequestUrl struct {
    Raw string `json:"raw"`
}

type CollectionItemRequest struct {
    Url         CollectionItemRequestUrl `json:"url"`
    Method      string                   `json:"method"`
    Header      []RequestHeader          `json:"header"`
    Body        RequestBody              `json:"body"`
    Description string                   `json:"description"`
}

但是这样字符串版本就不行了。有没有一种方法既能处理这两种情况,又能通过getter获取值,比如< code>request。Url.Get?

编辑:

以下是 JSON 的两个版本:

    "request": {
        "url": {
            "raw": "http://localhost:8081/users?per_page=5&page=2",
            "protocol": "http",
            "host": [
                "localhost"
            ],
            "port": "8081",
            "path": [
                "users"
            ],
            "query": [
                {
                    "key": "per_page",
                    "value": "5",
                    "equals": true,
                    "description": ""
                },
                {
                    "key": "page",
                    "value": "2",
                    "equals": true,
                    "description": ""
                }
            ],
            "variable": []
        },

"request": {
                "url": "http://localhost:8081/users/2",

注意:只有子集,整个JSON会太长。

共有1个答案

琴元凯
2023-03-14

有一个类型,它有一个自定义的unmarshal方法,该方法将首先取消元帅到一个空接口中,然后对它是否得到一个字符串map[string]interface{}进行类型切换,如下所示:

type example struct {
    URL myURL `json:"url"`
}

type myURL struct {
    url string
}

func (u *myURL) MarshalJSON() ([]byte, error) {
    return json.Marshal(u.url)
}

func (u *myURL) UnmarshalJSON(data []byte) error {
    var raw interface{}
    json.Unmarshal(data, &raw)
    switch raw := raw.(type) {
    case string:
        *u = myURL{raw}
    case map[string]interface{}:
        *u = myURL{raw["raw"].(string)}
    }
    return nil
}

const myStringURL string = `{"url": "http://www.example.com/as-string"}`
const myNestedURL string = `{"url": {"raw": "http://www.example.com/as-nested"}}`

func main() {
    var stringOutput example
    json.Unmarshal([]byte(myStringURL), &stringOutput)
    fmt.Println(stringOutput)

    var nestedOutput example
    json.Unmarshal([]byte(myNestedURL), &nestedOutput)
    fmt.Println(nestedOutput)
}

可在围棋操场上运行:

https://play.golang.org/p/I6KC4aXHpxm

 类似资料:
  • 问题内容: 我有以下json 问题在于,价值价值也是 要么 并将其存储在这些 我相信我通过这样做解决了不是数组而是单个对象的问题 现在,当整个事情以字符串形式返回时,我仍然处于困境.... 问题答案: 我们的想法是试图让(从外地 )为第一,如果抛出异常,这将意味着,没有 进入 ,这将意味着是。用同样的方法,我们可以计算出状况时场。 在我的示例代码中,其他操作也可能引发jsonExceptions,

  • 我是否遗漏了一些简单的东西,比如为类型提供一个数组?例如; 另外,有没有人比json-schema.org更好的JSON模式详细信息来源?我在哪里可以找到更多的例子选择?我不想阅读一个很大的文档/规范来找到可以在10行示例中轻松演示的东西。

  • 问题内容: 我在解组一些我无法控制的Json时遇到麻烦。在一个字段中,有99%的时间是字符串,但偶尔是数组。 杰森如下: 错误:json:无法将数组解组为字符串类型的Go结构字段MyListItem.display_name 问题答案: 使用json.RawMessage捕获变化的字段。 使用json“-”名称对解码器隐藏字段。顶级JSON解码后,应用程序将填充此字段。 解组顶级JSON: 根据原

  • 我无法使用Jackson Library解组一个JSON密钥,该密钥既可以保存字符串值,也可以保存另一个JSON对象。 下面是两个可能的值。 1) 2) 有人能核实一下,并就这个问题向我提出建议吗。

  • 问题内容: 我是JSON的新手。我正在尝试在Java(org.json.JSONObject(json.jar))中创建一个类似于(基本上是一组名称- 值对)的JSON字符串 谁能帮助我如何用Java创建它?我希望名称和值都在其中,以便我可以遍历集合,然后获得单个值。 问题答案: 该库是链接的,因此您可以通过首先创建一个json数组,然后创建单个对象并将它们一次添加到数组中来创建对象,如下所示:

  • 我通过将字符串转换为BSON来进行MongoDB查找。在进行转换之前,是否有办法确定我拥有的字符串是否是Mongo的有效ObjectID? 下面是我当前findByID函数的coffeescript。它工作得很好,但是如果我确定字符串不是ID,我希望通过不同的属性进行查找。