嵌套的 JSON 数组在 Golang 中的解组构造

huangapple go评论98阅读模式
英文:

Nested Json Array constructs un-marshalling in golang

问题

我主要是在看如何在golang中解析下面的JSON数组。

{
"status": {"code": "SUCCESS"},
"result": {
"total_records": 1,
"records": [{
"last_modified_timestamp": 1501209015807,
"dns_servers": null,
"is_secured": false,
"nis_domains": null,
"storage_platform_resource_key": "e1ee32f9-6576-11e7-82a8-00a098697714",
"name": "vs1",
"nis_servers": null,
"created_timestamp": 1501208944094,
"dns_domains": null,
"key": "f59dacca-7379-11e7-82a8-00a098697714"
}]
}
}

我想提取这里的"key"字段。尝试了下面的语法,但无法成功获取我想要的内容。

var dat map[string]interface{}

// 反序列化JSON数据
if err := json.Unmarshal(body, &dat); err != nil {
fmt.Println(err)
}
svmRecordsMap := dat["result"].(map[string]interface{})["records"]
fmt.Printf("%+v", svmRecordsMap)

result := (svmRecordsMap["key"].([]interface{})[0]).(map[string]interface{})

在这里需要帮助。请注意,我不打算定义相应的结构并进行复制。

谢谢!

英文:

I was mainly looking at un-marshalling the below JSON array in golang.

{
 "status":{"code":"SUCCESS"},
 "result": {
              "total_records":1,
              "records": [{
                            "last_modified_timestamp":1501209015807,
                            "dns_servers":null,
                            "is_secured":false,
                            "nis_domains":null,
                            "storage_platform_resource_key":"e1ee32f9-6576-11e7-82a8-00a098697714",
                            "name":"vs1",
                            "nis_servers":null,
                            "created_timestamp":1501208944094,
                            "dns_domains":null,
                            "key":"f59dacca-7379-11e7-82a8-00a098697714"
                         }]
            }
 }

I am looking to extract the "key" field here. Tried the below syntax but not able to successfully get what i want.

var dat map[string]interface{}

// Unmarshall the JSON body
if err := json.Unmarshal(body, &dat); err != nil {
	fmt.Println(err)
}
svmRecordsMap := dat["result"].(map[string]interface{})["records"]
fmt.Printf("%+v", svmRecordsMap)

result := (svmRecordsMap["key"].([]interface{})[0]).(map[string]interface{})

Any help here would be very much appreciated. Note that i am not looking at defining corresponding structs and making a copy.

Thanks!

答案1

得分: 0

我认为这个解决方案可以给你一个提示,告诉你如何从这个JSON中提取key,而不需要创建任何额外的type

英文:

I think this solution can give you a hint what you suppose to do to extract keys from this JSON without any additional type creation.

答案2

得分: 0

我给你提供一个例子:https://play.golang.org/p/tReMMtGA2V

package main

import (
	"encoding/json"
	"fmt"
)

func main() {

	txt := `{
 "status":{"code":"SUCCESS"},
 "result": {
              "total_records":1,
              "records": [{
                            "last_modified_timestamp":1501209015807,
                            "dns_servers":null,
                            "is_secured":false,
                            "nis_domains":null,
                            "storage_platform_resource_key":"e1ee32f9-6576-11e7-82a8-00a098697714",
                            "name":"vs1",
                            "nis_servers":null,
                            "created_timestamp":1501208944094,
                            "dns_domains":null,
                            "key":"f59dacca-7379-11e7-82a8-00a098697714"
                         }]
            }
 }`

	var dat map[string]interface{}

	if err := json.Unmarshal([]byte(txt), &dat); err != nil {
		fmt.Println(err)
	}
	svmRecordsMap := dat["result"].(map[string]interface{})["records"]
	fmt.Printf("%+v", svmRecordsMap)

	result := svmRecordsMap.([]interface{})[0].(map[string]interface{})

	fmt.Println(result)

}

在你的例子中,当你访问svmRecordsMap时,需要删除"[key]"。

英文:

I let you an example: https://play.golang.org/p/tReMMtGA2V

package main

import (
	"encoding/json"
	"fmt"
)

func main() {

	txt := `{
 "status":{"code":"SUCCESS"},
 "result": {
              "total_records":1,
              "records": [{
                            "last_modified_timestamp":1501209015807,
                            "dns_servers":null,
                            "is_secured":false,
                            "nis_domains":null,
                            "storage_platform_resource_key":"e1ee32f9-6576-11e7-82a8-00a098697714",
                            "name":"vs1",
                            "nis_servers":null,
                            "created_timestamp":1501208944094,
                            "dns_domains":null,
                            "key":"f59dacca-7379-11e7-82a8-00a098697714"
                         }]
            }
 }`

	var dat map[string]interface{}

	if err := json.Unmarshal([]byte(txt), &dat); err != nil {
		fmt.Println(err)
	}
	svmRecordsMap := dat["result"].(map[string]interface{})["records"]
	fmt.Printf("%+v", svmRecordsMap)

	result := (svmRecordsMap.([]interface{})[0]).(map[string]interface{})

	fmt.Println(result)

}

In your example have to remove the "[key]" when you access to svmRecordsMap

huangapple
  • 本文由 发表于 2017年7月29日 00:16:19
  • 转载请务必保留本文链接:https://go.coder-hub.com/45378157.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定