Невозможно использовать (type [] map [string] interface {}) в качестве type [] строки в значении поля - PullRequest
0 голосов
/ 11 ноября 2019

Как сохранить массив JSON (в строковом формате) в строке [] (отдельная строка JSON в каждом индексе строкового массива)?

package main
import (
 "encoding/json"
 "fmt"
)
type StructData struct {
  Data      []string `json:"data"`
}

func main() {
 empArray := "[{\"abc\":\"abc\"},{\"def\":\"def\"}]"

 var results []map[string]interface{}

 json.Unmarshal([]byte(empArray), &results)

 pr := &StructData{results}
 prAsBytes, err := json.Marshal(pr)
 if err != nil {
    fmt.Println("error :", err)
 }
}

Здесь я получаю сообщение об ошибке

cannot use results (type []map[string]interface {}) as type []string in field value

Есть ли какой-либо другой метод для хранения данных каждой строки json в каждом индексе массива строк?

1 Ответ

0 голосов
/ 11 ноября 2019

Один из недостатков демаршалирования JSON на карту заключается в том, что он уходит только на 1 уровень глубины: то есть, если вы вложили JSON, он будет демонтировать только первый уровень вашей структуры данных. Это означает, что вам нужно не только выполнять итерации по карте results, но и создавать любой тип данных, необходимый для &StructData{}. Это будет выглядеть примерно так:

package main

import (
    "encoding/json"
    "fmt"
)

type StructData struct {
    Data []string `json:"data"`
}

func main() {
    empArray := "[{\"abc\":\"abc\"},{\"def\":\"def\"}]"

    var results []map[string]interface{}

    json.Unmarshal([]byte(empArray), &results)

    // create a new variable that we'll use as the input to StructData{}
    var unpacked []string

    // iterate through our results map to get the 'next level' of our JSON
    for _, i := range results {
        // marshal our next level as []byte
        stringified, err := json.Marshal(i)
        if err != nil {
            fmt.Println("error :", err)
        }
        // add item to our unpacked variable as a string
        unpacked = append(unpacked, string(stringified[:]))
    }
    pr := &StructData{unpacked}
    prAsBytes, err := json.Marshal(pr)
    if err != nil {
        fmt.Println("error :", err)
    }
    fmt.Println(string(prAsBytes[:]))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...