我正在使用 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中的乘客数据。
我已经把j2和j3合并成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/