【问题标题】:How to create struct from array loop key value [closed]如何从数组循环键值创建结构
【发布时间】:2020-11-22 00:47:12
【问题描述】:

谁能告诉我如何从一个数组创建多个结构。

示例:

{
   "key1": [
      {
         "subkey1": "", 
         "subkey2": ""
      },
      {
         "subkey1": "" 
      }
   ]
   "key2": [
      {
         "subkey1": "", 
         "subkey2": ""
      }
   ]
}

瞧,我需要创建一个结构 foreach 键并基于子键附加第二个结构。

【问题讨论】:

  • 您是在问如何将问题中的 JSON 文档解码为 Go 类型?
  • 是的,我在一个单独的文件中得到了 json,我需要读取文件并以 json 格式打印内容

标签: json loops go struct foreach


【解决方案1】:

你可以做你想做的事情的一种方法是:

package main

import (
    "encoding/json"
    "fmt"
    "log"
)

var input = `{
    "key1": [
       {
          "subkey1": "Apple", 
          "subkey2": "Dog"
       },
       {
          "subkey1": "Bear" 
       }
    ],
    "key2": [
       {
          "subkey1": "Monkey", 
          "subkey2": "Turtle"
       }
    ]
 }`

var response map[string][]map[string]string

func main() {
    var err = json.Unmarshal([]byte(input), &response)
    if err != nil {
        log.Fatalln(err.Error())
    }
    for k, v := range response {
        fmt.Printf("Key: %s : | Value : %v\n", k, v)
    }

    for _, v := range response["key1"] {
        fmt.Println(v["subkey1"])
    }
    }

哪个会打印:

    Key: key2 : | Value : [map[subkey1:Monkey subkey2:Turtle]]
    Key: key1 : | Value : [map[subkey1:Apple subkey2:Dog] map[subkey1:Bear]]
    Apple
    Bear

如果需要,您还可以使用结构体作为字典中的值:

package main

import (
    "encoding/json"
    "fmt"
    "log"
)

var input = `{
    "key1": [
       {
          "subkey1": "Apple", 
          "subkey2": "Dog"
       },
       {
          "subkey1": "Bear" 
       }
    ],
    "key2": [
       {
          "subkey1": "Monkey", 
          "subkey2": "Turtle"
       }
    ]
 }`

type YourStruct struct {
    Subkey1 string `json:"subkey1"`
    Subkey2 string `json:"subkey2"`
}

var response map[string][]YourStruct

func main() {
    var err = json.Unmarshal([]byte(input), &response)
    if err != nil {
        log.Fatalln(err.Error())
    }
    for k, v := range response {
        fmt.Printf("Key: %s : | Value : %v\n", k, v)
    }

    for _, v := range response["key1"] {
        fmt.Println(v.Subkey1)
    }
}

哪个会打印:

[~/Projects/GoSO]@somewhere #> go run main.go 
Key: key1 : | Value : [{Apple Dog} {Bear }]
Key: key2 : | Value : [{Monkey Turtle}]
Apple
Bear

【讨论】:

  • 感谢您的回答 Matias Barrios。
猜你喜欢
  • 1970-01-01
  • 2021-12-26
  • 2016-01-07
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
相关资源
最近更新 更多