如何解组数组内的对象

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

How to unmarshal objects inside array

问题

我正在尝试访问数组中对象的值。

  1. [
  2. {
  3. "name": "London",
  4. "lat": 51.5073219,
  5. "lon": -0.1276474,
  6. "country": "GB",
  7. "state": "England"
  8. }
  9. ]

我使用以下代码进行解组:

  1. content, err := ioutil.ReadAll(res.Body)
  2. if err != nil {
  3. log.Fatal(err)
  4. }
  5. var data []ResponseData
  6. err = json.Unmarshal(content, &data)
  7. if err != nil {
  8. log.Fatal(err)
  9. }

这是我的结构体:

  1. type ResponseData struct {
  2. Name string `json:"name"`
  3. Lat float32 `json:"lat"`
  4. Lon float32 `json:"lon"`
  5. Country string `json:"country"`
  6. State string `json:"state"`
  7. }

稍后,我只需要使用fmt.Println(data.Lat, data.Lon)即可。

英文:

I am trying to get access to object's values inside of array

  1. [
  2. {
  3. "name": "London",
  4. "lat": 51.5073219,
  5. "lon": -0.1276474,
  6. "country": "GB",
  7. "state": "England"
  8. }
  9. ]

I use this code to unmarshal it

  1. content, err := ioutil.ReadAll(res.Body)
  2. if err != nil {
  3. log.Fatal(err)
  4. }
  5. var data []ResponseData
  6. err = json.Unmarshal(content, &data)
  7. if err != nil {
  8. log.Fatal(err)
  9. }

This is my struct

  1. type ResponseData struct {
  2. Name string `json:"name"`
  3. Lat float32 `json:"lat"`
  4. Lon float32 `json:"lon"`
  5. Country string `json:"country"`
  6. State string `json:"state"`
  7. }

I need to simply fmt.Println(data.Lat, data.Lon) later.

答案1

得分: 1

你提供的代码应该可以成功解析JSON;问题出在你尝试使用结果的方式上。你说你想使用fmt.Println(data.Lat, data.Lon),但这样是行不通的,因为data是一个切片([]ResponseData),而不是ResponseData。你可以使用fmt.Println(data[0].Lat, data[0].Lon)(在检查元素数量后!),或者遍历元素。

下面的代码可能对你的实验有所帮助(playground - 这里包含比下面更多的内容):

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "log"
  6. )
  7. const rawJSON = `[
  8. {
  9. "name": "London",
  10. "lat": 51.5073219,
  11. "lon": -0.1276474,
  12. "country": "GB",
  13. "state": "England"
  14. }
  15. ]`
  16. type ResponseData struct {
  17. Name string `json:"name"`
  18. Lat float32 `json:"lat"`
  19. Lon float32 `json:"lon"`
  20. Country string `json:"country"`
  21. State string `json:"state"`
  22. }
  23. func main() {
  24. var data []ResponseData
  25. err := json.Unmarshal([]byte(rawJSON), &data)
  26. if err != nil {
  27. log.Fatal(err)
  28. }
  29. if len(data) == 1 { // Would also work for 2+ but then you are throwing data away...
  30. fmt.Println("test1", data[0].Lat, data[0].Lon)
  31. }
  32. for _, e := range data {
  33. fmt.Println("test2", e.Lat, e.Lon)
  34. }
  35. }
英文:

The code you presented should unmarshal your JSON successfully; the issue is with the way you are trying to use the result. You say you want to use fmt.Println(data.Lat, data.Lon) but this will not work because data is a slice ([]ResponseData) not a ResponseData. You could use fmt.Println(data[0].Lat, data[0].Lon) (after checking the number of elements!) or iterate through the elements.

The below might help you experiment (playground - this contains a little more content than below):

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "log"
  6. )
  7. const rawJSON = `[
  8. {
  9. "name": "London",
  10. "lat": 51.5073219,
  11. "lon": -0.1276474,
  12. "country": "GB",
  13. "state": "England"
  14. }
  15. ]`
  16. type ResponseData struct {
  17. Name string `json:"name"`
  18. Lat float32 `json:"lat"`
  19. Lon float32 `json:"lon"`
  20. Country string `json:"country"`
  21. State string `json:"state"`
  22. }
  23. func main() {
  24. var data []ResponseData
  25. err := json.Unmarshal([]byte(rawJSON), &data)
  26. if err != nil {
  27. log.Fatal(err)
  28. }
  29. if len(data) == 1 { // Would also work for 2+ but then you are throwing data away...
  30. fmt.Println("test1", data[0].Lat, data[0].Lon)
  31. }
  32. for _, e := range data {
  33. fmt.Println("test2", e.Lat, e.Lon)
  34. }
  35. }

huangapple
  • 本文由 发表于 2022年8月6日 07:49:54
  • 转载请务必保留本文链接:https://go.coder-hub.com/73256220.html
匿名

发表评论

匿名网友

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

确定