合并结构切片

我正在尝试将两个不同的 json 结构数组合并到一个 json blob 中(来自单独的分页请求)。但是,我无法将它们合并在一起:


package main


import (

  "encoding/json"

  "log"

)


func main() {

  superset := `[{"id": 1231, "name": "testing1"},{"id": 1235, "name": "testing2"}]`

  subset   := `[{"id": 1237, "name": "testing3"}]`


  s, _ := json.Marshal(superset)

  log.Printf(string(s))


  u, _ := json.Marshal(subset)

  log.Printf(string(u))


   for i := range s {

     u = append(u, s[i])

   }


   log.Printf(string(u))

}

然而,这给了我真的只是他们的串联:


"[{\"id\": 1237, \"name\": \"testing3\"}]""[{\"id\": 1231, \"name\": \"testing1\"},{\"id\": 1235, \"name\": \"testing2\"}]"

我希望输出看起来像:


[{"id": 1237, "name": "testing3"},{"id": 1231, "name": "testing1"},{"id": 1235, "name": "testing2"}]

我觉得我错过了一些愚蠢的东西。任何帮助将不胜感激。谢谢!


牧羊人nacy
浏览 112回答 1
1回答

当年话下

json.Marshal()将给定的值编组为 JSON(并将其作为 a 返回[]byte),因此您拥有的内容s是u保存输入 JSON 文本的 JSON 文本。附加(连接)这两个文本甚至不会产生有效的 JSON,显然不是你想要的。您的输入是 JSON 文本,包含一个 JSON 数组。因此,您应该做的是将您的输入解组为 Go 切片(类型为[]interface{}),您可以附加这些切片,然后将结果编组回 JSON。像这样的东西:superset := `[{"id": 1231, "name": "testing1"},{"id": 1235, "name": "testing2"}]`subset := `[{"id": 1237, "name": "testing3"}]`var s1, s2 []interface{}if err := json.Unmarshal([]byte(superset), &s1); err != nil {    panic(err)}if err := json.Unmarshal([]byte(subset), &s2); err != nil {    panic(err)}s2 = append(s2, s1...)result, err := json.Marshal(s2)if err != nil {    panic(err)}fmt.Println(string(result))这个输出(在Go Playground上试试):[{"id":1237,"name":"testing3"},{"id":1231,"name":"testing1"},{"id":1235,"name":"testing2"}]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go