发现了许多类似的问题(标题),但没有一个解决了我的问题,所以这里是它。
我有一个JSON字符串,其中包含一些已知字段(应该始终存在)以及任意数量的未知/任意字段。
{"known1": "foo", "known2": "bar", "unknown1": "car", "unknown2": 1}
在此示例中,的已知1
和的已知2
是已知的字段。的未知1
和的未知2
是任意/未知的字段。
未知字段可以具有任何名称(键)和任何值。值类型可以是字符串、布尔值、float64 或 int。
我想要的是找到最简单、最优雅(惯用)的方法来解析这样的消息。
我使用了以下结构:
type Message struct {
Known1 string `json:"known1"`
Known2 string `json:"known2"`
Unknowns []map[string]interface{}
}
使用这个结构和上面的示例JSON消息,我想实现一个Message
,如下所示(从fmt. Printf("%v", msg)
输出):
{Known1:foo Known2:bar Unknowns:[map[unknown1:car] map[unknown2:1]]}
https://play.golang.org/p/WO6XlpK_vJg
这不起作用,未知数未按预期填充剩余的未知
键/值对。
https://play.golang.org/p/Mw6fOYr-Km8
这是可行的,但我需要两个解组,一个用于填充已知字段(使用别名类型以避免无限循环),第二个用于将所有字段作为map[string]接口{}
并处理未知数。
https://play.golang.org/p/a7itXObavrX
这有效,似乎是我的解决方案中的最佳选择。
选项2和3有效,但我很好奇是否有人有更简单/更优雅的解决方案。
很可能没有适合你的现有解决方案。作为解决方案的补充,您可以尝试使用原始解析库,如:
最后一个是我的,它有一些未完成的特性,但原始解析已经完成。
您也可以对上述库使用反射来设置结构中的已知字段。
TMTOWTDI,我认为您找到了一个合理的解决方案。您可以考虑的另一个选项——我猜与您的选项2相似——是将其散集到map[string]接口{}
上。
然后遍历键和值,并对数据执行任何需要的操作,必要时对值运行类型断言。根据您需要执行的操作,您可以完全跳过该结构,或者仍然填充它。
package main
import (
"encoding/json"
"fmt"
)
func main() {
jsonMsg := `{"known1": "foo", "known2": "bar", "unknown1": "car", "unknown2": 1}`
var msg map[string]interface{}
fmt.Println(json.Unmarshal([]byte(jsonMsg), &msg))
fmt.Printf("%+v", msg)
}
打印
<nil>
map[known1:foo known2:bar unknown1:car unknown2:1]
https://play.golang.org/p/Bl99Cq5tFWW
我正在尝试编写一个能够处理json响应的结构类型,就像这样 由于每次键都不一样…不同的响应可能有或多或少的键,不同的键,正如您可以看到的50x100返回特定大小的多个图像,我如何创建与此匹配的结构? 我可以像这样做: 以及针对特定键的它们的列表。但包含结构的外观如何? 类似于: 可能有效,但我无法列举所有可能的图像大小响应。最后的Image_Urls并不是一个真正的列表。我希望能够将它直接转储到j
问题内容: 我正在尝试编写一个可以处理json响应的结构类型 由于键每次都不相同…不同的响应可能包含或多或少的键,不同的键,如您所见,使用50x100返回特定大小的多个图像,我如何创建与此匹配的结构? 我可以这样: 用于单个项目,以及用于特定键的列表。但是包含的结构看起来如何? 就像是: 可能有效,但我无法列举所有可能的图像尺寸响应。另外,Image_Urls末尾没有真正的列表。我希望能够将其直接
我正在从我的go程序向API发出http请求。请求正文是一个 JSON 对象,如下所示: 其中XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 如何定义一个允许该部分接
我从遵循以下模式的 API 接收动态 JSON: 例如,原始数据将是: 考虑到我们想避免解组到这样的结构: 我们将不得不像这样将数据投回: 解组的更好方法是什么?
对于使用Java Spring RestTemplate完成的HTTP请求,我得到一个JSON键值对对象的响应,该对象带有动态键,如下所示。 回应: 如何将响应对象映射到POJO或映射? 我使用RestTemplate如下所示。
问题内容: 我有一个从包含重复密钥的数据库中获取的JSON字符串。我想通过将重复键的值组合到数组中来删除重复键。 例如 输入项 输出量 实际数据是一个可能嵌套的大文件。我不会提前知道有多少对。 我需要为此使用Java。org.json由于重复的键而引发异常,gson可以解析该字符串,但是每个重复的键都会覆盖最后一个。我需要保留所有数据。 如果可能的话,我想不编辑任何库代码就这样做 问题答案: 从今