gpt4 book ai didi

json - 构建结构以改变 API 提供的 json

转载 作者:行者123 更新时间:2023-12-01 21:17:33 25 4
gpt4 key购买 nike

我正在构建一个能够读取 Tibia 的 API 的不和谐机器人。
我面临一个问题。
api给出的部分json是这样的:
"account_information":{"loyalty_title":"Warden of Tibia","created":{"date":"2012-11-08 18:26:35.000000","timezone_type":2,"timezone":"CET"}}
但是,玩家可以选择隐藏此信息,如果隐藏,则 json 如下所示:"account_information":[]
因此,如您所见,有时它是一个空数组,有时它是一个结构。
我做了这个结构:

type ActInfo struct {
LoyaltyTitle string `json:"loyalty_title"`
Created struct {
Date string `json:"date"`
TimezoneType int `json:"timezone_type"`
Timezone string `json:"timezone"`
} `json:"created"`
}

但是,当我搜索隐藏此信息的角色时,它会出错。

基本上: type ActInfo struct适用于信息不隐藏时, type ActInfo []struct适用于显示信息的时间。但是他们互相错误。

如果我将其全部更改为:
AccountInformation json.RawMessage `json:"account_information"`

它适用于所有情况,但我不知道以后如何获取信息。

最佳答案

实现 json.Unmarshaler *ActInfo上的界面.
如果 JSON 是一个对象(以“{”开头),则将 JSON 解码为一个结构。

func (ai *ActInfo) UnmarshalJSON(data []byte) error {
if bytes.HasPrefix(data, []byte("{")) {
type actInfoNoMethods ActInfo
return json.Unmarshal(data, (*actInfoNoMethods)(ai))
}
return nil
}

为了防止对 UnnmarshalJSON 的递归调用,函数声明类型 actInfoNoMethods具有与 ActInfo 相同的基础结构声明.方法接收者是 converted*actInfoNoMethods用于调用 json.Unmarshal。

因为这个答案中的 UnmarshalJSON 方法直接解码到 ActInfo值,在 ActInfo 中添加或删除字段时无需更新 UnmarshalJSON 方法.

此答案中的方法返回 nil如果 JSON 不是对象。根据您的需要,如果JSON不是空数组,您可以报告错误,设置一个表示没有值的字段等。

Run it on the playground .

关于json - 构建结构以改变 API 提供的 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62183152/

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