gpt4 book ai didi

json - golang - 解码动态 'flat' http-json 响应

转载 作者:IT王子 更新时间:2023-10-29 02:15:55 25 4
gpt4 key购买 nike

我正在尝试解析经典 go-struct 中的动态 http-json 响应。我正在使用 orient-db,问题如下:

  • 每个对象都有静态元素
  • 每个对象都有自定义属性

例如,伪结构响应可以是:

type orientdb_reply struct {
# the "statics" elements that we always have
element_type string `json:"@type"`
rid string `json:"@rid"`
version int `json:"@version"`
class string `json:"@class"`

# then we have custom attributes for each object

# for example, object 'server' can have
hostname string `json:"hostname"`
ip string `json:"ip"`

# object 'display' can have
model string `json:"model"`
serial_number string `json:"serial_number"`
resolution string `json:"resolution"`

# and so on
}

这种情况下的困难在于响应是“扁平的”,如果它包含子元素,则解析是微不足道的,可以简单地添加其他结构作为子元素。

但在这种情况下,我想避免构建一个包含每个可能属性的超大结构,并且我希望将结构与对象类型分开,而不重复每个对象结构中的常量元素。

这可能吗?


一个可能的解决方案,现在我看到可能是:

type constant_fields struct {
# the "constants" elements that we ever have
element_type string `json:"@type"`
rid string `json:"@rid"`
version int `json:"@version"`
class string `json:"@class"`
}

type server_fields struct {
constants constant_fields
# for example, object 'server' can have
hostname string `json:"hostname"`
ip string `json:"ip"`
}

type display_fields struct {
constants constant_fields
# object 'display' can have
model string `json:"model"`
serial_number string `json:"serial_number"`
resolution string `json:"resolution"`
}

但这意味着我应该对每个请求进行两次解析(一次用于常量,另一次用于属性)。而且我不知道解析器是否喜欢 json 中不存在的“奇怪”结构 (constant_fields)。


真实例子:

{
"result" : [
{
"name" : "cen110t",
"guest_state" : "running",
"@type" : "d",
"guest_mac_addr" : "XX:XX:XX:XX:XX:XX",
"@version" : 1,
"hostname" : "",
"vm_uid" : "vm-29994",
"guest_ip" : "10.200.1.92",
"vm_type" : "VirtualMachine",
"@rid" : "#13:103",
"guest_family" : "linuxGuest",
"storage_type" : "",
"guest_fullname" : "CentOS 4/5/6/7 (64-bit)",
"@class" : "VM"
}
]
}

最佳答案

我想避免构建包含每个可能属性的超大结构

在你的结构定义中使用 json.RawMessage 作为属性类型,然后这个属性将保持原始状态而不被解析。

我想保持对象类型的结构独立,而不在每个对象结构中重复静态元素

因为您可以在结构中嵌套结构,就像在 json 对象中嵌套 json 对象一样。将通用(静态)属性放在一个 json 对象中并嵌套它是一种好方法。

问题更新

是的,它会起作用。 json 解析器将为您处理嵌套结构,不需要解析两次。但是你的 json 字符串需要匹配 Go 的结构结构。像 json

{
"k1":"v1",
"k2":{
"k21":"v21"
}
}

会匹配go struct:

type nest_struct struct{
K21 string `k21`
}

type top struct{
K1 string `k1`,
K2 nest_struct `k2`
}

关于json - golang - 解码动态 'flat' http-json 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31044662/

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