[英]how to access key and value from json array in go lang
I have a sample as below, 我有一个样本如下
result = [{"Key":"9802", "Record":{"action":"Warning","status":"Created","statusid":"9802","system":"CRM","thresholdtime":"9"}}]
how can i access thresholdtime value in go lang? 如何在Go lang中访问thresholdtime值?
I'm trying to display like this: result[0]["Record"]["thresholdtime"]
我正在尝试这样显示: result[0]["Record"]["thresholdtime"]
error: invalid operation: result[0]["Record"] (type byte does not support indexing)
Thanks 谢谢
Something like this should get you pretty close i think: https://play.golang.org/p/ytpHTTNMjB- 我认为这样的事情应该使您非常接近: https : //play.golang.org/p/ytpHTTNMjB-
Use the built-in json package to decode your data into structs (with attached json tags). 使用内置的json包将您的数据解码为结构(带有json标签)。 Then its as simple as accessing a struct field. 然后,就像访问struct字段一样简单。
The json.Unmarshal(...) Example should get you started. json.Unmarshal(...)示例应该可以帮助您入门。
Here's one way to do it ( Go Playground ): 这是一种实现方法( 前往Playground ):
func main() {
var krs []KeyRecord
err := json.Unmarshal([]byte(jsonstr), &krs)
if err != nil {
panic(err)
}
fmt.Println(krs[0].Record.ThresholdTime)
// 9
}
type KeyRecord struct {
Key int `json:"Key,string"`
Record Record `json:"Record"`
}
type Record struct {
Action string `json:"action"`
Status string `json:"status"`
StatusId int `json:"statusid,string"`
System string `json:"system"`
ThresholdTime int `json:"thresholdtime,string"`
}
var jsonstr = `
[
{
"Key": "9802",
"Record": {
"action": "Warning",
"status": "Created",
"statusid": "9802",
"system": "CRM",
"thresholdtime": "9"
}
}
]
`
You can unmarshal the JSON document into a generic type; 您可以将JSON文档解组为通用类型。 however, it's not recommended for many reasons, ultimately related to loss of type information: 但是,出于多种原因不建议使用此方法,最终会导致类型信息丢失:
xs := []map[string]interface{}{}
err := json.Unmarshal([]byte(jsonstr), &xs)
if err != nil {
panic(err)
}
ttstr := xs[0]["Record"].(map[string]interface{})["thresholdtime"].(string)
fmt.Printf("%#v\n", ttstr) // Need to convert to int separately, if desired.
// "9"
Use json.Unmarshal
to unmarshal the data into a suitable data type. 使用json.Unmarshal
将数据解组为合适的数据类型。 In many instances, you can (and I would recommend) using custom-declared struct
types with json
tags for this purpose. 在很多情况下,您可以(并且我会建议)为此目的使用带有json
标记的自定义声明的struct
类型。
However, to your comment on another answer, it is possible to unmarshal into an interface{}
and have the unmarshaller determine the most suitable data type to represent the JSON structure. 但是,对于您对另一个答案的评论,可以将其编组为一个interface{}
并让编组者确定最合适的数据类型来表示JSON结构。 For example, a slice of []interface{}
type will represent a list, a map of map[string]interface{}
a dictionary, primitive types for their equivalent JSON, etc. 例如, []interface{}
类型的切片将代表一个列表, map[string]interface{}
的映射,字典,其等效JSON的原始类型,等等。
I wrote a parser which uses this approach for another Stack question last week. 上周,我写了一个解析器,将这种方法用于另一个Stack问题。 This does not intend to be high-performance or highly tested code, but demonstrates the key points: 这并不是要成为高性能或经过高度测试的代码,而是要说明关键点:
package main
import (
"encoding/json"
"fmt"
"log"
"reflect"
"strconv"
"strings"
)
// Some arbitrary JSON
const js = `
{
"key1": [
{"key2": false, "some_other_key": "abc"},
{"key3": 3}
],
"key2": {
"hello": "world"
},
"shallow": true,
"null_value": null
}`
func indentStringLines(s string, n int) string {
// Build indent whitespace - this has not been optimized!
var indent string
for i := 0; i < n; i++ {
indent += " "
}
parts := strings.Split(s, "\n")
for i := 0; i < len(parts) - 1; i++ {
parts[i] = indent + parts[i]
}
return strings.Join(parts, "\n")
}
func recursivelyPrintSlice(m []interface{}, indent int) string {
var str string
for i, val := range m {
str += fmt.Sprintf("%s: %s\n",
strconv.FormatInt(int64(i), 10),
recursivelyPrint(val, indent),
)
}
return strings.TrimSpace(str)
}
func recursivelyPrint(val interface{}, indent int) string {
var str string
switch v := val.(type) {
case bool:
str += strconv.FormatBool(v)
case float64:
str += strconv.FormatFloat(v, 'g', -1, 64)
case string:
str += v
case map[string]interface{}:
str += "{\n"
for key, childVal := range v {
str += fmt.Sprintf("%s: %s\n", key, recursivelyPrint(childVal, indent))
}
str += "}"
case []interface{}:
str += "[\n" + recursivelyPrintSlice(v, indent) + "\n]"
case nil:
str += "null"
default:
str += fmt.Sprintf(
"[unimplemented type printer for %s]",
reflect.ValueOf(v).Kind(),
)
}
return strings.TrimSpace(indentStringLines(str, indent+2))
}
func main() {
var x interface{}
err := json.Unmarshal([]byte(js), &x)
if err != nil {
log.Fatal(err)
}
fmt.Println(recursivelyPrint(x, 0))
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.