2014-03-26 56 views
3

我有一段时间解析JSON字符串,最后终于降落在https://github.com/bitly/go-simplejson。它看起来非常有前途的,但它仍然给了我一个空的结果以下JSON阵列:使用Go获取JSON数组中的特定键值

{ 
"data": { 
    "translations": [ 
    { 
    "translatedText": "Googlebot: Deutsch, um die Luft-Speed-Geschwindigkeit einer unbeladenen Schwalbe?" 
    } 
    ] 
} 
} 

我想通过仅指定键进入translatedText。原因是我的JSON结构不可预测,所以我想定位任何JSON数组,但指定一个键而不知道JSON数组的完整结构。

这是代码段的我用其中content包含JSON字节数组:

f, err := js.NewJson(content) 

if err != nil { 
    log.Println(err) 
} 

t := f.Get("translatedText").MustString() 

log.Println(t) 

t始终是空白:(希望任何指针

回答

5

你的问题是,该功能Get不会递归搜索结构;它只会查找当前级别的密钥。

您可以做的是创建一个递归函数,用于搜索e结构并在找到它时返回该值。下面是一个使用一个工作示例标准包encoding/json

package main 

import (
    "encoding/json" 
    "fmt" 
) 

// SearchNested searches a nested structure consisting of map[string]interface{} 
// and []interface{} looking for a map with a specific key name. 
// If found SearchNested returns the value associated with that key, true 
// If the key is not found SearchNested returns nil, false 
func SearchNested(obj interface{}, key string) (interface{}, bool) { 
    switch t := obj.(type) { 
    case map[string]interface{}: 
     if v, ok := t[key]; ok { 
      return v, ok 
     } 
     for _, v := range t { 
      if result, ok := SearchNested(v, key); ok { 
       return result, ok 
      } 
     } 
    case []interface{}: 
     for _, v := range t { 
      if result, ok := SearchNested(v, key); ok { 
       return result, ok 
      } 
     } 
    } 

    // key not found 
    return nil, false 
} 


func main() { 
    jsonData := []byte(`{ 
"data": { 
    "translations": [ 
    { 
    "translatedText": "Googlebot: Deutsch, um die Luft-Speed-Geschwindigkeit einer unbeladenen Schwalbe?" 
    } 
    ] 
} 
}`) 

    // First we unmarshal into a generic interface{} 
    var j interface{} 
    err := json.Unmarshal(jsonData, &j) 
    if err != nil { 
     panic(err) 
    } 

    if v, ok := SearchNested(j, "translatedText"); ok { 
     fmt.Printf("%+v\n", v) 
    } else { 
     fmt.Println("Key not found") 
    } 

} 

结果:

谷歌机器人:德语,嗯死拉夫特高速-Geschwindigkeit einer unbeladenen施瓦尔贝?

游乐场:http://play.golang.org/p/OkLQbbId0t

+0

令人惊叹。谢谢。 – Etienne

+0

@Etienne:欢迎光临!请注意,如果结构中有多个相同键名的实例,它将返回它找到的第一个键。如果你使用嵌套的JSON对象而不是数组(你似乎这样做),那么返回值将是任意的。 Happy Go编码! – ANisus

相关问题