json - 将数组插入golang中的json对象

标签 json go

我正在使用 go 处理文本文件中的数据,并希望输出这样的 json 记录:

[{
        "ship": "RMS Titanic",
        "crew": [{
            "name": "Captain Smith"
        }, {
            "name": "First Officer Murdoch"
        }],
        "passengers": [{
            "name": "Jack Dawson"
        }, {
            "name": "Rose Dewitt Bukater"
        }]
    },
    {
        "ship": "ship2",
        "crew": [{
            "name": "crew 1"
        }, {
            "name": "crew 2"
        }],
        "passengers": [{
            "name": "passenger 1"
        }, {
            "name": "passenger 2"
        }]
    }
]

这是我的代码片段:

package main

import (
        "fmt"
        "encoding/json"
)

func main() {
        var crew []map[string]string
        var passengers []map[string]string

        s1 := map[string]string{ "name": "RMS Titanic"}
        j1, _ := json.Marshal(s1)
        fmt.Printf("j1: %s\n", string(j1))

        s2 := map[string]string{ "name": "Captain Smith" }
        crew = append(crew, s2)
        s2 = map[string]string{ "name": "First Officer Murdoch" }
        crew = append(crew, s2)
        j2, _ := json.Marshal(crew)
        fmt.Printf("j2: %s\n", string(j2))

        s3 := map[string]string{ "name": "Jack Dawson"}
        passengers = append(passengers, s3)
        s3 = map[string]string{ "name": "Rose Dewitt Bukater" }
        passengers = append(passengers, s3)

        j3, _ := json.Marshal(passengers)
        fmt.Printf("j3: %s\n", string(j3))

        s4 :=  map[string]string{"crew": string(j2), "passengers": string(j3)}
        j4, _ := json.Marshal(s4)
        fmt.Printf("j4: %s\n", string(j4))

}

输出:

j1: {"name":"RMS Titanic"}
j2: [{"name":"Captain Smith"},{"name":"First Officer Murdoch"}]
j3: [{"name":"Jack Dawson"},{"name":"Rose Dewitt Bukater"}]
j4: {"crew":"[{\"name\":\"Captain Smith\"},{\"name\":\"First Officer Murdoch\"}]","passengers":"[{\"name\":\"Jack Dawson\"},{\"name\":\"Rose Dewitt Bukater\"}]"}

我正在处理j1中的船舶数据、j2中的船员数据和j3中的乘客数据。

我已经把j2j3合并成j4了,但是引号s被转义了,怎么un-escape引号标记 ?

如何在其中插入 j1 数据,以便输出与我希望的 json 输出相匹配?

最佳答案

解决方案不是对字符串进行转义,而是将要序列化的完整结构编码为 JSON,例如:

ship1 := map[string]interface{}{
    "ship": "RMS Titanic",
    "crew": crew,
    "passengers": passengers,
}

ship1Json, err := json.Marshal(ship1)
if err != nil {
    panic(err)
}

fmt.Println("ship1:", string(ship1Json))

slice 中有两艘船的另一个示例:

ship2 := map[string]interface{}{
    "ship": "ship2",
    "crew": crew,
    "passengers": passengers,
}

ships := []map[string]interface{}{ship1, ship2}

shipsJson, err := json.Marshal(ships)
if err != nil {
    panic(err)
}

fmt.Println("ships:", string(shipsJson))

如果我们打印缩进的 JSON,结果更容易看到:

indented, err := json.MarshalIndent(ships, "", "  ")
if err != nil {
    panic(err)
}

fmt.Println(string(indented))

给予:

[
  {
    "crew": [
      {
        "name": "Captain Smith"
      },
      {
        "name": "First Officer Murdoch"
      }
    ],
    "passengers": [
      {
        "name": "Jack Dawson"
      },
      {
        "name": "Rose Dewitt Bukater"
      }
    ],
    "ship": "RMS Titanic"
  },
  {
    "crew": [
      {
        "name": "Captain Smith"
      },
      {
        "name": "First Officer Murdoch"
      }
    ],
    "passengers": [
      {
        "name": "Jack Dawson"
      },
      {
        "name": "Rose Dewitt Bukater"
      }
    ],
    "ship": "ship2"
  }
]

另见 playground.

关于json - 将数组插入golang中的json对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49345010/

相关文章:

java - 创建日记应用程序,但无法从 TextView 中获取要保存在 firebase 数据库中的文本

javascript - vue js嵌套数组加载到表

javascript - 来自 JSON 对象的多维数组

performance - 在 Go 中以 GMP 风格的性能处理大量数据

go - docker 错误 : Volume specifies nonexistent driver inmemory

Python3 使用 Metaclass 创建 JSON 文件中定义的类

javascript - 强制定向布局,在鼠标悬停时列出源和目标值

unicode - 构建 ngram 频率表并处理多字节 rune

go - Google 的 Go 语言中的并发例程

json - 如何在 golang 自定义结构类型中绑定(bind) json stringify 数据?