用嵌套数组编组 JSON?

Posted

技术标签:

【中文标题】用嵌套数组编组 JSON?【英文标题】:Marshaling JSON with nested array? 【发布时间】:2022-01-16 12:03:27 【问题描述】:

我想像这样创建 JSON:


  "name": "val1",
  "version": "val2",
  "type": "val3",
  "settings": [
    "setting1,
    "setting2",
    "setting3",
    [
      "option1",
      "option2"
    ] 
  ]

但我不知道如何在settings 中创建嵌套数组:

package main

import (
        "encoding/json"
        "fmt"
)

type Config struct 
        Name     string   `json:"name"`
        Version  string   `json:"version"`
        Type     string   `json:"type"`
        Settings []string `json:"settings"`


func main() 
        settings := []string"setting1", "setting2", "setting3"
        options := []string"option1", "option2"
        setopts := append(settings, options...)

        c := &Config"val1", "val2", "val3", setopts

        j, err := json.Marshal(c)
        if err != nil 
                panic(err)
        

        fmt.Println(string(j))

通过 jq 管道输出以提高可读性:

$ ./main | jq

  "name": "val1",
  "version": "val2",
  "type": "val3",
  "settings": [
    "setting1",
    "setting2",
    "setting3",
    "option1",
    "option2"
  ]

结果是option1option2settings 数组中的值,但它们应该位于settings 的嵌套数组中。此外,编组时选项可能并不总是存在,在这种情况下不应创建嵌套数组。

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

您在此处显示的输出:

    "setting1",
    "setting2",
    "setting3",
    [
      "option1",
      "option2"
    ]

可以描述为 JSON 字符串 字符串数组。

您可以使用[]interface 对其进行建模,并将字符串或切片附加到其上:

type Config struct 
        Name     string        `json:"name"`
        Version  string        `json:"version"`
        Type     string        `json:"type"`
        Settings []interface `json:"settings"`


func main() 
        settings := []interface
              "setting1", 
              "setting2", 
              "setting3",
              []string"option1", "option2",
        

        c := &Config"val1", "val2", "val3", settings

        j, err := json.Marshal(c)
        if err != nil 
                panic(err)
        

        fmt.Println(string(j))

游乐场:https://go.dev/play/p/8LPAVBPmd8w

【讨论】:

仅供参考:您可以使用“MarshalIndent()”而不是“Marshal()”来输出缩进的 json。

以上是关于用嵌套数组编组 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb多层嵌套数组如何精确查询(内容处为格式化的json截图,评论里面是json的内容)?

EXTJS 4 嵌套 json 数组数据到网格面板

用JAVA进行Json数据解析(对象数组的相互嵌套)

在带有数组的嵌套 Json 上使用 Pandas json_normalize

java怎么解析多层嵌套的json得到每个元素

如何处理常见的JSON嵌套结构