2017-02-17 2 views
0

Я пытаюсь распаковать массив JSON следующего типа:демаршалинга JSON массив верхнего уровня в карте строки в строку

[ 
{"abc's": "n;05881364"}, 
{"abcoulomb": "n;13658345"}, 
{"abcs": "n;05881364"} 
] 

в map[string]string. Этот вопрос Golang parse JSON array into data structure почти ответил на мою проблему, но моя - действительно карта, а не массив карт. Демаршалинга в []map[string]string работал, но теперь я получаю карту map[string]string, а не просто map из string, как это должно быть

+3

JSON показан массив карт, где каждая карта имеет одну пару ключа/значения. Если вы хотите создать строку 'map [string] string', вам придется развязать ее в массив карт, а затем создать из нее одну карту. –

+0

@ AndySchweig, так что нет прямого пути? –

+0

@ AndySchweig Я подумал, что лучший способ вместо того, чтобы перебирать каждый элемент карты и извлекать его ключ и значение и добавлять к новой карте. –

ответ

3

Там нет никакого способа сделать это непосредственно с json пакета; вы должны сделать преобразование самостоятельно. Это просто:

package main 

import (
    "encoding/json" 
    "fmt" 
) 

func main() { 
    data := []byte(` 
     [ 
     {"abc's": "n;05881364"}, 
     {"abcoulomb": "n;13658345"}, 
     {"abcs": "n;05881364"} 
     ] 
    `) 

    var mapSlice []map[string]string 
    if err := json.Unmarshal(data, &mapSlice); err != nil { 
     panic(err) 
    } 
    resultingMap := map[string]string{} 
    for _, m := range mapSlice { 
     for k, v := range m { 
      resultingMap[k] = v 
     } 
    } 
    fmt.Println(resultingMap) 
} 

Выход

map[abc's:n;05881364 abcoulomb:n;13658345 abcs:n;05881364] 
2

Альтернативные (хотя очень похожи) ответить Алекс, чтобы определить свой собственный тип наряду с функцией UnmarshalJSON.

package main 

import (
    "encoding/json" 
    "fmt" 
) 

type myMapping map[string]string 

func (mm myMapping) UnmarshalJSON(b []byte) error { 
    var temp []map[string]string 
    if err := json.Unmarshal(b, &temp); err != nil { 
     return err 
    } 
    for _, m := range temp { 
     for k, v := range m { 
      mm[k] = v 
     } 
    } 
    return nil 
} 

func main() { 
    data := []byte(` 
      [ 
       {"abc's": "n;05881364"}, 
       {"abcoulomb": "n;13658345"}, 
       {"abcs": "n;05881364"} 
      ]`) 

    resultingMap := myMapping{} 
    if err := json.Unmarshal(data, &resultingMap); err != nil { 
     panic(err) 
    } 
    fmt.Println(resultingMap) 
} 

Playground