создать данные JSON как интерфейс map [string] с заданными данными - PullRequest
0 голосов
/ 19 сентября 2019

Ниже приведены данные, полученные от

{
  "details": [
    {
      "attdetails": [
        {
          "id": "a48c8539-caaf-49a5-9346-8e88e60e7af4",
          "name": "compute01"
        },
        {
          "id": "a48c8539-caaf-49a5-9346-8e88e60e7af4",
          "name": "compute02"

        }
      ],
      "name": "item1"
    },
    {
      "attdetails": [
        {
          "id": "85bdafa7-274e-4180-b76f-12f390a274fc",
          "name": "compute03"
        },
        {
          "id": "85bdafa7-274e-4180-b76f-12f390a274fc",
          "name": "compute04"
        }
      ],
      "name": "item1"
    }
  ]
}

Я пытаюсь создать JSON со следующими данными:

["item1":
   {"compute01": "a48c8539-caaf-49a5-9346-8e88e60e7af4"},
   {"compute02": "a48c8539-caaf-49a5-9346-8e88e60e7af4"}, 
   {"compute03": "a48c8539-caaf-49a5-9346-8e88e60e7af4"}, 
   {"compute04": "a48c8539-caaf-49a5-9346-8e88e60e7af4"}
]

Я пытаюсь создать карту [строка]интерфейс, но я не могу сгруппировать их и добавить в массив к определенному ключу.

Ниже приведен пример кода, который я пытаюсь использовать:

var childrens map[string]interface{}

for _, a := range atts {
    att, ok := childrens[a.Name]
    if !ok {
        childrens[a.Name] = make([]map[string]string, 0)
    }
    var c map[string]string
    for _, each := range a.Details {
        c[each.Name] = each.Value
    }

    childrens[a.Name] = append(c, childrens[a.Name])
}

Ответы [ 3 ]

1 голос
/ 19 сентября 2019

Вот еще один вариант.

package main

import (
    "encoding/json"
    "fmt"
)

var raw = `
{
"details": [
    {
    "attdetails": [
        {
        "id": "a48c8539-caaf-49a5-9346-8e88e60e7af4",
        "name": "compute01"
        },
        {
        "id": "a48c8539-caaf-49a5-9346-8e88e60e7af4",
        "name": "compute02"

        }
    ],
    "name": "item1"
    },
    {
    "attdetails": [
        {
        "id": "85bdafa7-274e-4180-b76f-12f390a274fc",
        "name": "compute03"
        },
        {
        "id": "85bdafa7-274e-4180-b76f-12f390a274fc",
        "name": "compute04"
        }
    ],
    "name": "item1"
    }
]
}
`

type Data struct {
    Details []struct {
        AttDetails []struct {
            Id   string `json:"id"`
            Name string `json:"name"`
        } `json:"attdetails"`
        Name string `json:"name"`
    } `json:"details"`
}

func main() {
    var data Data

    err := json.Unmarshal([]byte(raw), &data)
    if err != nil {
        fmt.Println(err)
    }

    output := map[string][]map[string]string{}
    for _, detail := range data.Details {
        for _, attdetail := range detail.AttDetails {
            output[detail.Name] = append(output[detail.Name], map[string]string{
                attdetail.Name: attdetail.Id,
            })
        }
    }

    // b, _ := json.Marshal(output) // non-pretty version
    b, _ := json.MarshalIndent(output, "", "\t")
    fmt.Println(string(b))
}
1 голос
/ 19 сентября 2019

Я думаю, что что-то вроде приведенного ниже должно сработать,

https://play.golang.org/p/YbZ1niXyFBR

Это не совсем те структуры, которые вы хотели, но должны дать вам точку в направлении настройки.

0 голосов
/ 19 сентября 2019

Мне удалось получить необходимую структуру, используя следующий код:

var cs = make(map[string][]map[string]string)


for _, a := range atts{
    _, ok := childrens[a.Name]
    if !ok {
        cs[a.Name] = make([]map[string]string, 0)
    }
    var c = make(map[string]string)
    for _, each := range a.Details {
        c[each.Name] = each.Value
    }
    cs[a.Name] = append(cs[a.ClassName], c)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...