在Go语言中编码嵌套的JSON。

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

Encoding nested JSON in Go

问题

我在寻找这个示例时遇到了很多麻烦。互联网上的大部分信息都是关于解码JSON的。

我想将一些数据序列化为嵌套的JSON,例如:

{
"item": {
"title": "Items",
"properties": [
{
"num": 1,
"name": "Item 1"
},
{
"num": 2,
"name": "Item 2"
}
]
}
}

我知道如何使用扁平结构来编组数据,但如何将数据放入可以进行嵌套序列化的结构中呢?

我找到了这个工具,可以根据JSON模式生成结构,但我不知道如何将数据放入子结构中。

http://mholt.github.io/json-to-go/

type Example struct {
Item struct {
Title string json:"title"
Properties []struct {
Num int json:"num"
Name string json:"name"
} json:"properties"
} json:"item"
}

英文:

I've had a lot of trouble finding an example of this. Most of the information on the internet is about decoding JSON.

I'd like to serialize some data into nested JSON, like for example:

{
  "item": {
      "title": "Items",
    "properties": [
      {
        "num": 1,
        "name": "Item 1"
      },
      {
        "num": 2,
        "name": "Item 2"
      }
    ]
  }
}

I know how to marshal data with a flat struct, but how do I put data into a struct that can be serialized with nesting?

http://play.golang.org/p/nDKmv1myTD

I found this tool that generates a struct from a JSON schema, but I don't understand how to get data into the sub structs.

http://mholt.github.io/json-to-go/

type Example struct {
	Item struct {
		Title string `json:"title"`
		Properties []struct {
			Num int `json:"num"`
			Name string `json:"name"`
		} `json:"properties"`
	} `json:"item"`
}

答案1

得分: 13

你找到的这个工具很不错,但我不会使用它。它使得初始化结构体变得困难。

使用你的代码片段进行初始化的示例:(http://play.golang.org/p/_Qw3Qp8XZh)

package main

import (
	"encoding/json"
	"fmt"
)

type Example struct {
	Item struct {
		Title      string `json:"title"`
		Properties []struct {
			Num  int    `json:"num"`
			Name string `json:"name"`
		} `json:"properties"`
	} `json:"item"`
}

func main() {
	info := &Example{
		Item: struct {
			Title      string `json:"title"`
			Properties []struct {
				Num  int    `json:"num"`
				Name string `json:"name"`
			} `json:"properties"`
		}{
			Title: "title",
			Properties: []struct {
				Num  int    `json:"num"`
				Name string `json:"name"`
			}{
				{Num: 0, Name: "name0"},
				{Num: 1, Name: "name1"},
			},
		},
	}

	b, err := json.Marshal(info)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(b))
}

结果(格式化后):

{
  "item": {
    "title": "title",
    "properties": [
      {
        "num": 0,
        "name": "name0"
      },
      {
        "num": 1,
        "name": "name1"
      }
    ]
  }
}

我认为使用具名结构体而不是匿名嵌套结构体更好。

使用具名结构体的相同示例:http://play.golang.org/p/xm7BXxEGTC

package main

import (
	"encoding/json"
	"fmt"
)

type Example struct {
	Item Item `json:"item"`
}

type Item struct {
	Title      string     `json:"title"`
	Properties []Property `json:"properties"`
}

type Property struct {
	Num  int    `json:"num"`
	Name string `json:"name"`
}

func main() {
	info := &Example{
		Item: Item{
			Title: "title",
			Properties: []Property{
				{Num: 0, Name: "name0"},
				{Num: 1, Name: "name1"},
			},
		},
	}

	b, err := json.Marshal(info)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(b))
}

这是完全相同的代码,但我觉得这种方式更清晰、更易于使用。

英文:

This tool you found is nice, but I would not use it. It makes it difficult to initialize the structs.

Init example with your snippet: (http://play.golang.org/p/_Qw3Qp8XZh)

package main

import (
	"encoding/json"
	"fmt"
)

type Example struct {
	Item struct {
		Title      string `json:"title"`
		Properties []struct {
			Num  int    `json:"num"`
			Name string `json:"name"`
		} `json:"properties"`
	} `json:"item"`
}

func main() {
	info := &Example{
		Item: struct {
			Title      string `json:"title"`
			Properties []struct {
				Num  int    `json:"num"`
				Name string `json:"name"`
			} `json:"properties"`
		}{
			Title: "title",
			Properties: []struct {
				Num  int    `json:"num"`
				Name string `json:"name"`
			}{
				{Num: 0, Name: "name0"},
				{Num: 1, Name: "name1"},
			},
		},
	}

	b, err := json.Marshal(info)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(b))
}

Result (pretty printed):

{
  "item": {
    "title": "title",
    "properties": [
      {
        "num": 0,
        "name": "name0"
      },
      {
        "num": 1,
        "name": "name1"
      }
    ]
  }
}

I think it is better to use named struct vs anonymous nested ones.

Same example with named structs: http://play.golang.org/p/xm7BXxEGTC

package main

import (
	"encoding/json"
	"fmt"
)

type Example struct {
	Item Item `json:"item"`
}

type Item struct {
	Title      string     `json:"title"`
	Properties []Property `json:"properties"`
}

type Property struct {
	Num  int    `json:"num"`
	Name string `json:"name"`
}

func main() {
	info := &Example{
		Item: Item{
			Title: "title",
			Properties: []Property{
				{Num: 0, Name: "name0"},
				{Num: 1, Name: "name1"},
			},
		},
	}

	b, err := json.Marshal(info)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(b))
}

It is the exact same thing, but I find it more clear and easy to use.

huangapple
  • 本文由 发表于 2014年6月23日 05:53:16
  • 转载请务必保留本文链接:https://go.coder-hub.com/24356087.html
匿名

发表评论

匿名网友

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

确定