在struct中构造map [string] struct

时间:2017-02-21 22:03:59

标签: json go

我有一个如下所示的JSON文件:

{
  "jailbreaks": [
    {
      "jailbroken": false,
      "name": "",
      "version": "",
      "url": "",
      "anleitung": [],
      "ios": {
        "start": "10.2.1"
      },
      "caveats": "",
      "platforms": []
    },
    {
      "jailbroken": true,
      "name": "Yalu102",
      "version": "beta 6",
      "url": "https://domain-dl.tld",
      "anleitung": [
        { "blog": "title", "link": "http://domain.tld/" },
        { "blog": "Test", "link": "http://google.at" }
      ],
      "ios": {
        "start": "10.2"
      },
      "caveats": "some text here",
      "platforms": [
        "Windows",
        "OS X",
        "Linux"
      ]
    },

我创建了这样的对象:

type Jailbreak struct {
    Jailbroken bool   `json:"jailbroken"`
    Name       string `json:"name"`
    Version    string `json:"version"`
    URL        string `json:"url"`
    Anleitung  map[string]struct {
        Name string `json:"blog"`
        Link string `json:"link"`
    } `json:"anleitung"`

    Firmwares struct {
        Start string `json:"start"`
        End   string `json:"end"`
    } `json:"ios"`

    Platforms []string `json:"platforms"`
    Caveats   string   `json:"caveats"`
}

当我想构建我的go程序时,我收到一个错误,即无法读取JSON文件。但是一旦我删除map[string]struct我就可以编译并运行程序而没有任何错误,一切正常。 我是否在处理某些事情或者我的JSON文件中是否有错误?

2 个答案:

答案 0 :(得分:1)

提供的json无效(因为数组没有结束]而顶级json对象缺少另一个结束})所以让我们假设它是这样的:

{
  "jailbreaks": [
    {
      "jailbroken": false,
      "name": "",
      "version": "",
      "url": "",
      "anleitung": [],
      "ios": {
        "start": "10.2.1",
        "end": ""
      },
      "platforms": [],
      "caveats": ""
    },
    {
      "jailbroken": true,
      "name": "Yalu102",
      "version": "beta 6",
      "url": "https://domain-dl.tld",
      "anleitung": [
        {
          "blog": "title",
          "link": "http://domain.tld/"
        },
        {
          "blog": "Test",
          "link": "http://google.at"
        }
      ],
      "ios": {
        "start": "10.2",
        "end": ""
      },
      "platforms": [
        "Windows",
        "OS X",
        "Linux"
      ],
      "caveats": "some text here"
    }
  ]
}

数据结构Jailbreaks(第一个),marshals-to / unmarshals-来自这个json:

type Jailbreaks struct {
    List []Jailbreak `json:"jailbreaks"`
}

type Jailbreak struct {
    Jailbroken bool   `json:"jailbroken"`
    Name       string `json:"name"`
    Version    string `json:"version"`
    URL        string `json:"url"`
    Anleitung  []struct {
        Name string `json:"blog"`
        Link string `json:"link"`
    } `json:"anleitung"`

    Firmwares struct {
        Start string `json:"start"`
        End   string `json:"end"`
    } `json:"ios"`

    Platforms []string `json:"platforms"`
    Caveats   string   `json:"caveats"`
}

如您所见,Anleitung被声明为切片(而不是地图)。

答案 1 :(得分:-1)

使用omitempty标记表示您的" anleitung"在JSON中是空的以供使用。但请注意,在这种情况下,您的Jailbreak结构不会有" anleitung"字段。

将地图的json标志更改为;

Anleitung   map[string]struct {
    Name string `json:"blog"`
    Link string `json:"link"`
} `json:"anleitung,omitempty"`

选项2;

我猜你也可以使用Anleitung map[string]interface{},但对于"将字符串映射保存到任意数据类型"会更好。在你的情况下,数据不是任意的,而是空的,我猜。看起来这只是暂时的。

我选择选项1,然后在访问之前检查我的结构是否包含任何Anleitung数据。