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

如何解析/反序列化动态JSON

慕凌
2023-03-14

场景:
考虑以下是JSON:

{
   "Bangalore_City": "35_Temperature",
   "NewYork_City": "31_Temperature",
   "Copenhagen_City": "29_Temperature"
}

如果您注意到,数据的结构是这样的,即没有硬编码键提到City/温度基本上只是值。

问题:我无法解析任何动态 JSON。

问题:有人能找到这种JSON解析的解决方案吗?我试着简单点

注意:以上JSON只是示例。有很多应用程序正在使用当前的API,所以我不想改变数据的结构。我的意思是我不能换成如下的东西:

[{
   "City_Name":"Bangalore",
   "Temperature": "35"
},...]

然后我可以定义< code>struct

type TempData struct {
  City_Name string
  Temperature  string
}

共有3个答案

邬友樵
2023-03-14

只是添加一个如何解析任何有效JSON的通用答案;< code>var m interface{}适用于所有类型。这包括map(OP要求的)数组、字符串、数字和嵌套结构。

var m interface{}
err := json.Unmarshal([]byte(input), &m)
if err != nil {
    panic(err)
}
fmt.Println(m)
奚高扬
2023-03-14

标准编码/json 适用于大多数用例,但与其他解决方案相比,它可能相当慢。如果需要性能,请尝试使用 fastjson。它解析任意 JSON,而无需创建与 JSON 架构匹配的结构或映射。

请参见下面的示例代码。它遍历JSON对象的所有< code>(key,value)对:

var p fastjson.Parser
v, err := p.Parse(input)
if err != nil {
    log.Fatal(err)
}

// Visit all the items in the top object
v.GetObject().Visit(func(k []byte, v *fastjson.Value) {
    fmt.Printf("key=%s, value=%s\n", k, v)

    // for nested objects call Visit again
    if string(k) == "nested" {
        v.GetObject().Visit(func(k []byte, v *fastjson.Value) {
            fmt.Printf("nested key=%s, value=%s\n", k, v)
        })
    }
})
堵宪
2023-03-14

您可以将其解组为map[string]string,例如:

m := map[string]string{}
err := json.Unmarshal([]byte(input), &m)
if err != nil {
    panic(err)
}
fmt.Println(m)

输出(包装):

map[Bangalore_City:35_Temperature NewYork_City:31_Temperature
    Copenhagen_City:29_Temperature]

在围棋操场上试试。

这样,无论键或值是什么,您都可以在< code>map中打印或循环所有对。

另外请注意,虽然您的示例仅包含string值,但如果值类型不同(例如string、数字等),您可以使用 作为值类型,在这种情况下,您的映射将是 类型。

还要注意,我创建了一个库来轻松地处理这些动态对象,这在这些情况下可能会有很大的帮助:< code > github . com/icza/dyno 。

 类似资料:
  • 问题内容: 场景: 考虑以下是JSON: 如果注意到的话,数据的结构方式是没有硬编码键提及/ 它基本上只是值。 问题: 我无法解析任何动态的JSON。 问题: 有人能找到这种JSON解析的解决方案吗?我尝试了go-simplejson,gabs和default 但没有运气。 注意: 上面的JSON仅用于示例。而且有许多应用程序正在使用当前的API,因此我不想更改数据的结构。我的意思是我不能更改为以

  • 问题内容: 我有以下需要反序列化的Json字符串。 第一个字段“ 123456789”是一个ID号,因此基本上该值可以根据要查询的数据而有所不同。 我在Visual Studio中使用C#。显然,因为第一个字段的值可以更改,所以我无法使用预定义的类将JSON反序列化为该字段,因为该字段将用作类名,但该字段的值与该类名不匹配。 有没有一种方法可以将其反序列化为某种动态类,但仍可以像访问预定义类一样访

  • 问题内容: 我有一个像这样的课程: 我想序列化它们的列表: 当我进行序列化时,动物属性的类型信息将丢失。有没有一种方法可以某种方式安装解析器侦听器,以便在遇到列表中的每个元素时提供正确的类进行反序列化?这就是手动提供描述类类型的字符串的想法。 谢谢 问题答案: Gson项目代码库中的RuntimeTypeAdapter据说可以很好地用于多态序列化和反序列化。我认为我尚未尝试使用它。有关更多信息,请

  • 本文向大家介绍.net实现序列化与反序列化实例解析,包括了.net实现序列化与反序列化实例解析的使用技巧和注意事项,需要的朋友参考一下 序列化与反序列化是.net程序设计中常见的应用,本文即以实例展示了.net实现序列化与反序列化的方法。具体如下: 一般来说,.net中的序列化其实就是将一个对象的所有相关的数据保存为一个二进制文件(注意:是一个对象) 而且与这个对象相关的所有类型都必须是可序列化的

  • 从我的Java后端,我正在使用另一个我不管理的后端,它的API定义不可用。我正在创建它的服务的OpenAPI定义,并使用Swagger Codigen来生成客户端。 有一个endpoint返回一个复杂对象: 在该对象中,和始终存在,但在同一级别上有数百个动态项。在上面的示例中,关键点是可以预测的,但实际上是字母和数字的序列,类似于“245df921”。动态项始终是具有相同项数和相同预期位置的数组。

  • 问题内容: 我正在尝试使用Northwind OData服务: http://services.odata.org/V3/OData/OData.svc/Products?$format=json 并将其反序列化为一系列产品: 但是序列化器似乎不喜欢该部分,并且事实是那里有2 条记录(不确定它们是什么)。 是否有捷径可寻? 问题答案: 使用Json.Net