类型断言一个嵌套接口

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

Type assert a nested interface

问题

我将JSON解析为interface{}。我无法对其进行类型断言。http://play.golang.org/p/NAe8voYnb8。

  1. package main
  2. import (
  3. "encoding/json"
  4. "log"
  5. )
  6. func main() {
  7. b := []byte(`{"key1":[
  8. {"apple":"A", "banana":"B", "id": "C"},
  9. {"cupcake": "C", "pinto":"D"}
  10. ]
  11. }`)
  12. var data interface{}
  13. _ = json.Unmarshal(b, &data)
  14. log.Println(data)
  15. // map[key1:[map[apple:A id:C banana:B] map[cupcake:C pinto:D]]]
  16. ndata, ok := data.(map[string][]map[string]string)
  17. log.Println(ok, ndata)
  18. // false map[]
  19. key_data, ok := ndata["key1"].([]map[string]string)
  20. log.Println(ok, key_data)
  21. // false []
  22. }

有人知道出了什么问题吗?

英文:

I json.Unmarshal JSON into an interface{}. I can't type assert it. http://play.golang.org/p/NAe8voYnb8.

  1. package main
  2. import (
  3. "encoding/json"
  4. "log"
  5. )
  6. func main() {
  7. b := []byte(`{"key1":[
  8. {"apple":"A", "banana":"B", "id": "C"},
  9. {"cupcake": "C", "pinto":"D"}
  10. ]
  11. }`)
  12. var data interface{}
  13. _ = json.Unmarshal(b, &data)
  14. log.Println(data)
  15. // map[key1:[map[apple:A id:C banana:B] map[cupcake:C pinto:D]]]
  16. ndata, ok := data.(map[string][]map[string]string)
  17. log.Println(ok, ndata)
  18. // false map[]
  19. key_data, ok := ndata["key1"].([]map[string]string)
  20. log.Println(ok, key_data)
  21. // false []
  22. }

Anyone know what's up?

答案1

得分: 5

例如,

  1. package main
  2. import (
  3. "encoding/json"
  4. "log"
  5. )
  6. func somefunc(data interface{}) {
  7. log.Printf("%T\n", data)
  8. // 输出:map[string]interface {}
  9. log.Println(data)
  10. // 正确输出:map[key1:[map[apple:A id:C banana:B] map[cupcake:C pinto:D]]]
  11. ndata, _ := data.(map[string]interface{})
  12. log.Println(ndata)
  13. // 应该输出:map[key1:[map[apple:A banana:B id:C] map[cupcake:C pinto:D]]]
  14. key_data, _ := ndata["key1"]
  15. log.Println(key_data)
  16. // 应该输出:[map[apple:A banana:B id:C] map[cupcake:C pinto:D]]]
  17. }
  18. func main() {
  19. b := []byte(`{"key1":[{"apple":"A", "banana":"B", "id": "C"},{"cupcake": "C", "pinto":"D"}]}`)
  20. var m interface{}
  21. _ = json.Unmarshal(b, &m)
  22. somefunc(m)
  23. }

输出:

  1. 2012/10/18 18:21:43 map[string]interface {}
  2. 2012/10/18 18:21:43 map[key1:[map[apple:A id:C banana:B] map[cupcake:C pinto:D]]]
  3. 2012/10/18 18:21:43 map[key1:[map[banana:B apple:A id:C] map[pinto:D cupcake:C]]]
  4. 2012/10/18 18:21:43 [map[banana:B apple:A id:C] map[pinto:D cupcake:C]]
英文:

For example,

  1. package main
  2. import (
  3. "encoding/json"
  4. "log"
  5. )
  6. func somefunc(data interface{}) {
  7. log.Printf("%T\n", data)
  8. // Prints: map[string]interface {}
  9. log.Println(data)
  10. // Correctly prints: map[key1:[map[apple:A id:C banana:B] map[cupcake:C pinto:D]]]
  11. ndata, _ := data.(map[string]interface{})
  12. log.Println(ndata)
  13. // Should print: map[key1:[map[apple:A banana:B id:C] map[cupcake:C pinto:D]]]
  14. key_data, _ := ndata["key1"]
  15. log.Println(key_data)
  16. // Should print: [map[apple:A banana:B id:C] map[cupcake:C pinto:D]]]
  17. }
  18. func main() {
  19. b := []byte(`{"key1":[{"apple":"A", "banana":"B", "id": "C"},{"cupcake": "C", "pinto":"D"}]}`)
  20. var m interface{}
  21. _ = json.Unmarshal(b, &m)
  22. somefunc(m)
  23. }

Output:

  1. 2012/10/18 18:21:43 map[string]interface {}
  2. 2012/10/18 18:21:43 map[key1:[map[apple:A id:C banana:B] map[cupcake:C pinto:D]]]
  3. 2012/10/18 18:21:43 map[key1:[map[banana:B apple:A id:C] map[pinto:D cupcake:C]]]
  4. 2012/10/18 18:21:43 [map[banana:B apple:A id:C] map[pinto:D cupcake:C]]

答案2

得分: 1

如果你需要一种简单的处理嵌套JSON数据的方法,我已经编写了一个包来实现这个功能:
https://github.com/opesun/jsonp

这可以减轻在每个级别上都需要输入assert的痛苦。请参阅文档以获取描述。

英文:

If you need an easy way to handle nested JSON data, I have written a package to do that:
https://github.com/opesun/jsonp

This alleviates the pain of having to type assert at every level. See the docs for description.

huangapple
  • 本文由 发表于 2012年10月19日 03:52:00
  • 转载请务必保留本文链接:https://go.coder-hub.com/12962634.html
匿名

发表评论

匿名网友

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

确定