Объединение фрагментов структур - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь объединить два разных массива 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"}]

Я чувствую, что упускаю какую-то глупость. Любая помощь будет принята с благодарностью. Спасибо!

1 Ответ

0 голосов
/ 04 августа 2020

json.Marshal() маршалирует данное значение в JSON (и возвращает его как []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"}]
...