2014-09-22 24 views
5

Go unmarshal lồng cấu trúc JSONGo unmarshal lồng JSON cấu trúc

http://play.golang.org/p/f6ilWnWTjm

Tôi cố gắng để giải mã các chuỗi sau nhưng chỉ nhận được giá trị null.

Làm cách nào để giải mã cấu trúc JSON lồng nhau trong Go?

Tôi muốn chuyển đổi những điều sau đây thành cấu trúc dữ liệu bản đồ.

Vui lòng cho tôi biết.

package main 

import (
    "encoding/json" 
    "fmt" 
) 

func main() { 
    jStr := ` 
{ 
    "AAA": { 
     "assdfdff": ["asdf"], 
     "fdsfa": ["1231", "123"] 
    } 
} 
` 
    type Container struct { 
    Key string `json:"AAA"` 
    } 
    var cont Container 

    json.Unmarshal([]byte(jStr), &cont) 
    fmt.Println(cont) 
} 
+1

sử dụng 'json.RawMessage' http://play.golang.org/p/Kqej3UzHWY –

Trả lời

11

Sử dụng cấu trúc lồng nhau trong Đi tới khớp với cấu trúc lồng nhau trong JSON.

Dưới đây là một ví dụ về cách xử lý ví dụ của bạn JSON:

package main 

import (
    "encoding/json" 
    "fmt" 
    "log" 
) 

func main() { 
    jStr := ` 
    { 
     "AAA": { 
      "assdfdff": ["asdf"], 
      "fdsfa": ["1231", "123"] 
     } 
    } 
    ` 

    type Inner struct { 
     Key2 []string `json:"assdfdff"` 
     Key3 []string `json:"fdsfa"` 
    } 
    type Container struct { 
     Key Inner `json:"AAA"` 
    } 
    var cont Container 
    if err := json.Unmarshal([]byte(jStr), &cont); err != nil { 
     log.Fatal(err) 
    } 
    fmt.Printf("%+v\n", cont) 
} 

playground link

Bạn cũng có thể sử dụng một loại vô danh cho struct nội:

type Container struct { 
    Key struct { 
     Key2 []string `json:"assdfdff"` 
     Key3 []string `json:"fdsfa"` 
    } `json:"AAA"` 
} 

playground link

hoặc cả hai cấu trúc bên ngoài và bên trong:

var cont struct { 
    Key struct { 
     Key2 []string `json:"assdfdff"` 
     Key3 []string `json:"fdsfa"` 
    } `json:"AAA"` 
} 

playground link

Nếu bạn không biết tên trường trong cấu trúc bên trong, sau đó sử dụng bản đồ:

type Container struct { 
    Key map[string][]string `json:"AAA"` 
} 

http://play.golang.org/p/gwugHlCPLK

Có thêm nhiều lựa chọn. Hy vọng rằng điều này giúp bạn đi đúng hướng.

+0

tôi đã đến qua một vấn đề mà stuct lồng nhau của tôi đã trở lại trống rỗng như vậy "{{}} "vấn đề là một không gian trong việc thiết lập tên json trong cấu trúc. điều này đã không hoạt động như có một không gian'json: "tên" '. nhưng điều này đã làm 'json:" name "'. mặt cọ! –

4

Trước hết: Đừng bỏ qua lỗi được trả về bởi hàm hoặc phương thức trừ khi bạn có lý do chính đáng để làm như vậy.

Nếu bạn thực hiện thay đổi sau để mã:

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

Bạn sẽ thấy thông báo lỗi cho biết lý do tại sao giá trị là rỗng:

json: đối tượng không thể unmarshal vào Go giá trị của loại chuỗi

Chỉ cần đặt: Key không thể thuộc loại string, vì vậy bạn phải sử dụng một công ty khác pe. Bạn có một vài lựa chọn về cách giải mã nó tùy thuộc vào đặc điểm của giá trị Key:

  • Nếu cấu trúc là tĩnh, sử dụng struct khác để phù hợp với cấu trúc này.
  • Nếu cấu trúc rất linh hoạt, sử dụng interface{} (hoặc map[string]interface{} nếu nó là luôn luôn loại đối tượng JSON)
  • Nếu giá trị không phải là để được truy cập, chỉ được sử dụng trong mã hóa JSON sau, hoặc nếu giải mã là bị chậm trễ, sử dụng json.RawMessage
Các vấn đề liên quan