gpt4 book ai didi

JSON 键可以是字符串或对象

转载 作者:IT王子 更新时间:2023-10-29 01:01:27 24 4
gpt4 key购买 nike

我想解析一些 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 获取值,例如 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 会太长。

最佳答案

拥有一个具有自定义解码方法的类型,该方法将首先解码为一个空接口(interface),然后根据它是否获得 stringmap[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)
}

可在此处的 go playground 中运行:

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

关于JSON 键可以是字符串或对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48305425/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com