2016-05-28 2 views
1

У меня есть структура JSon, которая выглядит какУплотненный JSON демаршалинга с 2d ломтиков в структуры не работает в golang

{ 
"devices": [ 
    { 
     "server": { 
      "bu": { 
       "add_info": false, 
       "applications": [ 
        [ 
         "Systems", 
         12 
        ], 
        [ 
         "SomeProject", 
         106 
        ] 
       ], 
       "name": [ 
        [ 
         "SomeName", 
         4 
        ], 
        [ 
         "CommonName", 
         57 
        ] 
       ], 
       "owners": [ 
        "SomeOwner1", 
        "SomeOwner2" 
       ], 
       "users": [ 
        "SomeUser1", 
        "SomeUser2" 
       ] 
      } 
     } 
    } 
    ] 
} 

Я пытаюсь добавить его на структуру, а структура выглядит

type TwoD [][]string 
type MainContainer struct { 
    Devices []struct{ 
     Server struct{ 
      Bu struct{ 
       Add_info string `json:"add_info"` 
       Applications TwoD `json:"applications"` 
       Name TwoD `json:"name"` 
       Owners []string `json:"owners"` 
       Users []string `json:"users"` 
       } `json:"bu"` 
       } `json:"server"` 
    } `json:"devices"` 
} 

Однако, когда я печатаю структуру, я получаю только одно значение из 2D-фрагмента и ничего за его пределами.

func main() { 
jsonfile, err := ioutil.ReadFile("./search.json") 
if err != nil { 
    fmt.Println(err) 
    os.Exit(1) 
} 
var jsonobject MainContainer 
json.Unmarshal(jsonfile, &jsonobject) 
fmt.Printf("%v", jsonobject) 
} 

{[{{{ [[Systems ]] [] [] []}}}]}

Но если я опуская 2d ломтиков в структуры как

type MainContainer struct { 
Devices []struct{ 
     Server struct{ 
      Bu struct{ 
       Add_info string `json:"add_info"` 
       //Applications TwoD `json:"applications"` 
       //Name TwoD `json:"name"` 
       Owners []string `json:"owners"` 
       Users []string `json:"users"` 
       } `json:"bu"` 
       } `json:"server"` 
    } `json:"devices"` 
} 

все печатается

{[{{{ [SomeOwner1 SomeOwner2] [SomeUser1 SomeUser2]}}}]}

Может кто-то помочь мне определить, что здесь не так?

Here - ссылка на игровую площадку golang со структурой и образцом json. Два фрагмента TwoD комментируются в структуре.

Примечание: отредактирована ссылка на детскую площадку с одним расколом 2d, без разметки, чтобы можно было заметить разницу, и изменил строку типа на bool, как указано @cnicutar, Спасибо.

ответ

2

Основная проблема заключается в том, что вы не обрабатываете ошибку, возвращаемую json.Unmarshal. Как только вы справитесь с этим, проблемы с вашим json (и структурой декодирования) станут очевидными.

if err := json.Unmarshal(jsonfile, &jsonobject); err != nil { 
    fmt.Printf("Unmarshal: %v\n", err) 
} 

Первое:

распаковать JSON: не может распаковать BOOL в значение Go типа строки

Так Add_info должно быть bool. После фиксации, что и раскомментировав Applications:

распаковать JSON: не может распаковать номер в значение Go типа строки

После изменения 12 до «12» и 106 в «106» результат:

{[{{{false [[Systems 12] [SomeProject 106]] [SomeUser1 SomeUser2]}}}]} 
+0

Спасибо @cnicutar. Я пропустил это. Однако, когда я изменил его на bool, он все равно останавливается на многомерном массиве. https://play.golang.org/p/2HMUi6JadG Я расколол часть 2d среза в структуре, и вы можете увидеть разницу. – nohup

+0

Ничего, ваша ошибка в ловушке помогла мне. Это фрагмент строки и числа, поэтому я установил пустой интерфейс – nohup

+1

@nohuo stop go development, [читать это] (https://golang.org/doc/effective_go.html), а затем продолжить разработку. – eduncan911