如何使用Go将这个JSON数组解组到结构切片中?

时间:2019-08-30 21:29:04

标签: arrays json go

我有一个像这样的JSON文件:

[
  {   

    "namespace": "pulsarNamespace1",
    "name": "pulsarFunction1",
    "tenant": "pulsarTenant1"
  },

  {   

    "namespace": "pulsarNamespace2",
    "name": "pulsarFunction2",
    "tenant": "pulsarTenant1"
  }
]

我试图将这个JSON数组反序列化/解组为结构片段,但是我正在获取具有空(默认)值的结构。

运行代码时,它可以正确地将文件读取为字符串,但是并不能正确地反序列化数据,而只是将空结构写入控制台,如下所示:

  

[] main.Config {main.Config {namespace:“”,承租人:“”,名称:“”}},   main.Config {namespace:“”,承租人:“”,名称:“”}}}

     

命名空间:名称:%!d(string =)

     

命名空间:名称:%!d(string =)

这是我在Go中的代码:

package main

import (
    "encoding/json"
    "fmt"
    "io"
    "io/ioutil"
    "net/http"
    "os"
) 
// Ignore the unused imports.

type Config struct {
    namespace string `json:"namespace,omitempty"`
    tenant    string `json:"tenant,omitempty"`
    name      string `json:"name,omitempty"`
}

func getConfigs() string {
    b, err := ioutil.ReadFile("fastDeploy_example.json") // just pass the file name
    if err != nil {
        fmt.Print(err)
    }
    str := string(b) // convert content to a 'string'
    fmt.Println(str) // print the content as a 'string'
    return str
}

func deserializeJson(configJson string) []Config {
    jsonAsBytes := []byte(configJson)
    configs := make([]Config, 0)
    err := json.Unmarshal(jsonAsBytes, &configs)
    fmt.Printf("%#v\n", configs)
    if err != nil {
        panic(err)
    }
    return configs
}

func main() {
    // Unmarshal each fastDeploy config component into a slice of structs.
    jsonConfigList := getConfigs()
    unmarshelledConfigs := deserializeJson(jsonConfigList)

    for _, configObj := range unmarshelledConfigs {
        fmt.Printf("Namespace: %s Name: %d\n", configObj.namespace, configObj.name)
    }
}

此外,如果我了解使用omitempty的目的,那么它甚至都不应该编写空白字段。但是,看来它还是在写它们。

如何在Golang中正确地反序列化/解组JSON数组到我的结构片中?

1 个答案:

答案 0 :(得分:4)

导出结构的字段名称:命名空间,租户,名称等,以便解组器可以通过反射对其进行设置。

回复:omitempty,这是json封送拆收器的标签。如果使用空字符串将结构封送至json,则这些字段将被省略。如果您打印该结构,则将打印它们。