当前位置: 首页 > 知识库问答 >
问题:

将具有任意键/值对的 JSON 取消封送为结构

姬欣怡
2023-03-14

发现了许多类似的问题(标题),但没有一个解决了我的问题,所以这里是它。

我有一个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有效,但我很好奇是否有人有更简单/更优雅的解决方案。

共有2个答案

廖华翰
2023-03-14

很可能没有适合你的现有解决方案。作为解决方案的补充,您可以尝试使用原始解析库,如:

  • https://github.com/buger/jsonparser
  • https://github.com/json-iterator/go
  • https://github.com/nikandfor/json

最后一个是我的,它有一些未完成的特性,但原始解析已经完成。

您也可以对上述库使用反射来设置结构中的已知字段。

邓阳炎
2023-03-14

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可以解析该字符串,但是每个重复的键都会覆盖最后一个。我需要保留所有数据。 如果可能的话,我想不编辑任何库代码就这样做 问题答案: 从今