从 JSON 中提取元素
Extracting Elements from JSON
我有一个函数returns JSON,return类型是这样的:
map[string]interface{}
在我的特殊情况下,我知道 returned JSON 看起来像这样:
{
"someNumber": 1,
"someString": "ee",
"someArray": [
"stringInArray",
{
"anotherNumber": 100,
"anotherString": "asdf",
"yetAnotherString": "qwer"
}
]
}
我想获得 "stringInArray" 和 "anotherString" 的值。例如,我从 Go by Example and blog.golang.org 搜索了解决方案,但没有成功。
例如,假设 res 是函数调用的 json returned,我尝试了这个(来自 go 博客):
var f interface{}
b := []byte(`res` )
err2 := json.Unmarshal(b, &f)
if err2!=nil{
log.Fatalf("Err unmarshalling: %v", err2)
}
m := f.( map[string]interface{} )
for k, v := range m {
switch vv := v.(type) {
case string:
fmt.Println(k, "is string", vv)
case int:
fmt.Println(k, "is int", vv)
case []interface{}:
fmt.Println(k, "is an array:")
for i, u := range vv {
fmt.Println(i, u)
}
default:
fmt.Println(k, "is of a type I don't know how to handle")
}
}
(我知道上面的内容不会完全符合我的要求,但这是一个开始。)
但是当代码执行命中 b := []byte(res
) 时,我得到这个错误:
Err unmarshalling: invalid character 'r' looking for beginning of value
获取值的最有效方法/最佳实践是什么?我对任何解决方案持开放态度,不一定是上述方法。
@sydnash 这是我在回复您的评论时承诺的代码:
type LoginResponse2 struct {
id float64
jsonrpc string
result struct {
token string
details struct {
a float64
b string
c float64
}
}
}
var resStruct2 LoginResponse2
// Convert result to json
b, _ :=json.Marshal(res)
fmt.Println( string(b) )
// results of Println:
{"id":1,"jsonrpc":"2.0","result":[ "myToken",{"a":someNumber,"b":"some string","c":someOtherNumber} ] }
// Unmarshall json into struct
err2 := json.Unmarshal(b, &resStruct2)
if err2 != nil {
log.Fatalf("Error unmarshalling json: %v", err)
}
fmt.Println("Here is json unmarshalled into a struct")
fmt.Println( resStruct2 )
// results of Println
{0 { {0 0}}}
在 golang 包 encoding/json 的文档中有一个如何解组 json 的示例。本质上你的问题是 un-marshal 希望将 json 放入 type
。因此,您的代码必须声明一个类型,该类型代表您正在转换的 json
。
json 示例和链接示例中声明的类型:
var jsonBlob = []byte(`[
{"Name": "Platypus", "Order": "Monotremata"},
{"Name": "Quoll", "Order": "Dasyuromorphia"}
]`)
type Animal struct {
Name string
Order string
}
一旦你定义了类型,它应该就位了。
我认为你应该使用 b := []byte(res) 而不是 b :=[]byte[res
] 并且 res 应该是 json 字符串或 []byte。 res
不是合法的 json 格式。
此信息可能对您有所帮助:
要将 JSON 解组为接口值,Unmarshal 在接口值中存储以下之一:
bool,对于 JSON 布尔值
float64,对于 JSON 个数字
字符串,对于 JSON 个字符串
[]接口{},用于JSON数组
地图[string]接口{},用于JSON个对象
nil 对于 JSON null
你可以看到 JSON 个数字没有 int 而是 float64。
我有一个函数returns JSON,return类型是这样的:
map[string]interface{}
在我的特殊情况下,我知道 returned JSON 看起来像这样:
{
"someNumber": 1,
"someString": "ee",
"someArray": [
"stringInArray",
{
"anotherNumber": 100,
"anotherString": "asdf",
"yetAnotherString": "qwer"
}
]
}
我想获得 "stringInArray" 和 "anotherString" 的值。例如,我从 Go by Example and blog.golang.org 搜索了解决方案,但没有成功。
例如,假设 res 是函数调用的 json returned,我尝试了这个(来自 go 博客):
var f interface{}
b := []byte(`res` )
err2 := json.Unmarshal(b, &f)
if err2!=nil{
log.Fatalf("Err unmarshalling: %v", err2)
}
m := f.( map[string]interface{} )
for k, v := range m {
switch vv := v.(type) {
case string:
fmt.Println(k, "is string", vv)
case int:
fmt.Println(k, "is int", vv)
case []interface{}:
fmt.Println(k, "is an array:")
for i, u := range vv {
fmt.Println(i, u)
}
default:
fmt.Println(k, "is of a type I don't know how to handle")
}
}
(我知道上面的内容不会完全符合我的要求,但这是一个开始。)
但是当代码执行命中 b := []byte(res
) 时,我得到这个错误:
Err unmarshalling: invalid character 'r' looking for beginning of value
获取值的最有效方法/最佳实践是什么?我对任何解决方案持开放态度,不一定是上述方法。
@sydnash 这是我在回复您的评论时承诺的代码:
type LoginResponse2 struct {
id float64
jsonrpc string
result struct {
token string
details struct {
a float64
b string
c float64
}
}
}
var resStruct2 LoginResponse2
// Convert result to json
b, _ :=json.Marshal(res)
fmt.Println( string(b) )
// results of Println:
{"id":1,"jsonrpc":"2.0","result":[ "myToken",{"a":someNumber,"b":"some string","c":someOtherNumber} ] }
// Unmarshall json into struct
err2 := json.Unmarshal(b, &resStruct2)
if err2 != nil {
log.Fatalf("Error unmarshalling json: %v", err)
}
fmt.Println("Here is json unmarshalled into a struct")
fmt.Println( resStruct2 )
// results of Println
{0 { {0 0}}}
在 golang 包 encoding/json 的文档中有一个如何解组 json 的示例。本质上你的问题是 un-marshal 希望将 json 放入 type
。因此,您的代码必须声明一个类型,该类型代表您正在转换的 json
。
json 示例和链接示例中声明的类型:
var jsonBlob = []byte(`[
{"Name": "Platypus", "Order": "Monotremata"},
{"Name": "Quoll", "Order": "Dasyuromorphia"}
]`)
type Animal struct {
Name string
Order string
}
一旦你定义了类型,它应该就位了。
我认为你应该使用 b := []byte(res) 而不是 b :=[]byte[res
] 并且 res 应该是 json 字符串或 []byte。 res
不是合法的 json 格式。
此信息可能对您有所帮助: 要将 JSON 解组为接口值,Unmarshal 在接口值中存储以下之一:
bool,对于 JSON 布尔值
float64,对于 JSON 个数字
字符串,对于 JSON 个字符串
[]接口{},用于JSON数组
地图[string]接口{},用于JSON个对象
nil 对于 JSON null
你可以看到 JSON 个数字没有 int 而是 float64。