当前位置: 首页 > 面试题库 >

如何访问深度嵌套的json键和值

顾穆冉
2023-03-14
问题内容

我正在用Go编写一个websocket客户端。我正在从服务器接收以下JSON:

{"args":[{"time":"2013-05-21 16:57:17"}],"name":"send:time"}

我正在尝试访问该time参数,但无法掌握如何深入了解接口类型:

 package main;
 import "encoding/json"
 import "log"
 func main() {
    msg := `{"args":[{"time":"2013-05-21 16:56:16", "tzs":[{"name":"GMT"}]}],"name":"send:time"}`
    u := map[string]interface{}{}
    err := json.Unmarshal([]byte(msg), &u)
    if err != nil {
        panic(err)
    }
    args := u["args"]
    log.Println( args[0]["time"] )   // invalid notation...
}

显然是错误的,因为这种表示法是不正确的:

   invalid operation: args[0] (index of type interface {})

我只是找不到一种方法来挖掘地图以获取深层嵌套的键和值。

一旦可以克服动态值,我便想声明这些消息。我将如何编写类型结构来表示这种复杂的数据结构?


问题答案:

您解码成的interface{}部分map[string]interface{}将与该字段的类型匹配。因此,在这种情况下:

args.([]interface{})[0].(map[string]interface{})["time"].(string)

应该回来 "2013-05-21 16:56:16"

但是,如果您知道JSON的结构,则应尝试定义一个与该结构匹配的结构,然后将其解组。例如:

type Time struct {
    Time time.Time      `json:"time"`
    Timezone []TZStruct `json:"tzs"` // obv. you need to define TZStruct as well
    Name string         `json:"name"`
}

type TimeResponse struct {
    Args []Time         `json:"args"`
}

var t TimeResponse
json.Unmarshal(msg, &t)

那可能不是完美的,但是应该可以给你这个主意



 类似资料:
  • 问题内容: 团队,编程新手。如下图所示对Json进行编组后,我有可用数据,该数据具有嵌套的Key值。我可以访问的固定键值,如何访问嵌套键值。拆封后,这是下面显示的字节切片数据—> 我可以使用以下代码访问平面键值 这是完整的功能 问题答案: 注意:这可能不适用于您的JSON结构。我根据您的问题推断出它将是什么,但是如果没有实际的结构,我无法保证它可以在不做任何修改的情况下工作。 如果要在映射中访问它

  • 问题内容: 假设我有一个像这样的JSON数组: 不,我想基于id查找某个对象,一旦有了该对象,就需要它的子代及其所有childs子代 所以可以说如果 4d024610-a39b-49ce-8581-a18500739a75* 我想找到一个具有ID的元素 * 那应该找到Element Sub2 现在,它应该产生所有将产生的所有子元素id id: 假设我会做 因此,我猜它有两个部分,首先找到“父”元素

  • 问题内容: 我的应用程序中有一个非常复杂的数据结构,需要对其进行操作。我试图跟踪玩家在他们的花园中有多少种错误。有十种错误,每种错误都有十种模式,每种模式都有十种颜色。所以可能有1000个独特的错误,我想追踪玩家每种类型的错误数量。嵌套的字典如下所示: 我没有使用此语法的任何错误或投诉。 当我想增加播放器的错误收集时,请执行以下操作: 我收到此错误: 字符串不能转换为’DictionaryInde

  • 问题内容: 假设我有json数据,例如 现在我正在从该json数据访问字段,例如: 如何以最有效的方式从给定的json数据访问第三个字段()? 不起作用 一种可能是我使用for循环构造字符串,然后进行eval评估,但是有没有有效的方法呢? 问题答案: 老实说,我无法理解您的问题。JSON已经结构化了,为什么需要更改结构? 在您的情况下,我将按以下方式访问它: 如果碰巧希望 遍历 数据,则需要: 更

  • {“_index”:“pie”,“_type”:“flare”,“_id”:“2”,“_version”:1,“_score”:1,“_source”:{“id”:2,“父级”:1,“data”:{“memory”:50}}}

  • 问题内容: 我正在构建一些Python代码来读取和操作深层嵌套的dict(最终是为了与JSON服务进行交互,但是,将其用于其他用途将非常有用)我正在寻找一种方法,可以轻松地在内部深层读取/设置/更新值dict,不需要很多代码。 @另请参阅Python:通过属性以及索引访问来递归访问dict?-Curt Hagenlocher的“ DotDictify”解决方案非常雄辩。我也喜欢Ben Alman在