当JSON不是“期望”格式时,我发现GOLANG中的编组和拆组非常混乱。例如,在JSON配置文件(我正尝试与Viper一起使用)中,我有一个配置文件,看起来像:
{
"things" :{
"123abc" :{
"key1": "anything",
"key2" : "more"
},
"456xyz" :{
"key1": "anything2",
"key2" : "more2"
},
"blah" :{
"key1": "anything3",
"key2" : "more3"
}
}
}
其中“事物”可能是另一个对象中的一个对象n向下移动,我有一个struct:
type Thing struct {
Name string `?????`
Key1 string `json:"key2"`
Key2 string `json:"key2"`
}
我该如何解组JSON,更具体地说是解编viper配置(使用viper.Get(“ things”))来获得Things
类似数组:
t:= Things{
Name: "123abc",
Key1: "anything",
Key2: "more",
}
我尤其不确定如何将密钥作为结构字段
将地图用于动态键:
type X struct {
Things map[string]Thing
}
type Thing struct {
Key1 string
Key2 string
}
像这样解组:
var x X
if err := json.Unmarshal(data, &x); err != nil {
// handle error
}
操场上的例子
如果名称必须是该结构的成员,请编写一个循环以在解组后将其添加:
type Thing struct {
Name string `json:"-"` // <-- add the field
Key1 string
Key2 string
}
...
// Fix the name field after unmarshal
for k, t := range x.Things {
t.Name = k
x.Things[k] = t
}
操场上的例子
是否可以用未知字段散集JSON?该字段名总是不同的,但结构是相同的。JSON是POST请求的结果。 我的代码:
问题内容: package main 我想读入 我已经问了几个相关问题。 我已经阅读了一些文章和帖子,但仍然找不到解决方法。 问题答案: 我认为您正在以错误的方式进行操作。如果要使用C库,则可以使用C库读取文件。 不要纯粹使用cgo来拥有结构定义,您应该在Go中自己创建它们。然后,您可以编写适当的编组/解组代码以从原始字节读取。 快速的Google显示,有人已经完成了将相关C库的外观转换为Go所需
问题内容: 因此,我在解析golang中的数据时遇到了一些麻烦: } 使用此结构时,我可以很容易地输出它。 但是,一旦我将“ Gateways [] struct”分离成自己的结构,它就会返回一个空数组… 完整来源。 问题答案: 您的函数存在问题,您正在调用作为第一个参数传递,这是一个包名:这是模棱两可的。 如您所见,代码可以很好地更改函数。 输出:
问题内容: 我有一项通过REST为我提供属性的服务。现在,我想将身体解组为属性结构。请查看此操场示例:单击。当我只有一个财产时,可以轻松将其编组为。但是,服务器发出的ACTUAL响应有所不同。我要解组的实际响应是这样的: 不幸的是,我不知道如何解组。有人可以指出正确的方向吗? 问题答案: 您需要解组一片属性:http : //play.golang.org/p/eRgjfBHypH
问题内容: 我正试图解组该文件: 进入这个结构: 使用以下说明: 问题是在“ json-schema@0.2.3”中,我们有一个许可证数组而不是一个字符串,由于这个原因,我显然得到了 有没有一种方法可以自动处理可以是数组或字符串的字段? 谢谢 问题答案: 不幸的是,软件包没有提供真正的自动解决方案。 但是您可以将依赖项解组为a 而不是。只是一个,因此您可以根据第一个字节确定消息的类型。 例: 另一
问题内容: 我想得到一个表示像这样的json的字符串: {“投票”:{“ option_A”:“ 3”}} 并在其中包含一个“计数”键, 这样结束: {“投票”:{“ option_A”:“ 3”},“ count”:“ 1”} 这就是为什么我计划将其转换为json以便可以添加计数然后再次将其设置为字符串的原因。 问题是我不知道该json的结构 ,所以我无法使用,因为该结构有所不同。我怎样才能做到