2015-05-25 13 views
11

Tôi muốn phân tích cú pháp đối tượng JSON trong Go, nhưng muốn chỉ định giá trị mặc định cho các trường không được cung cấp. Ví dụ: tôi có loại cấu trúc:Cách chỉ định giá trị mặc định khi phân tích cú pháp JSON trong Go

type Test struct { 
    A string 
    B string 
    C string 
} 

Giá trị mặc định cho A, B và C là "a", "b" và "c" tương ứng. Điều này có nghĩa rằng khi tôi phân tích json:

{"A": "1", "C": 3} 

Tôi muốn để có được các cấu trúc:

Test{A: "1", B: "b", C: "3"} 

Đây có phải là có thể sử dụng được xây dựng trong gói encoding/json? Nếu không, có thư viện Go nào có chức năng này không?

Trả lời

37

Điều này có thể sử dụng mã hóa/json: khi gọi json.Unmarshal, bạn không cần phải cung cấp cấu trúc trống, bạn có thể cung cấp cho nó một giá trị mặc định.

Ví dụ của bạn:

var example []byte = []byte(`{"A": "1", "C": "3"}`) 

out := Test{ 
    A: "default a", 
    B: "default b", 
    // default for C will be "", the empty value for a string 
} 
err := json.Unmarshal(example, &out) // <-- 
if err != nil { 
    panic(err) 
} 
fmt.Printf("%+v", out) 

Chạy this example in the Go playground lợi nhuận {A:1 B:default b C:3}.

Như bạn có thể thấy, json.Unmarshal(example, &out) unmarshals JSON thành out, ghi đè các giá trị được chỉ định trong JSON, nhưng để lại các trường khác không thay đổi.

3

Trong trường hợp u có một danh sách hoặc bản đồ của Test cấu trúc câu trả lời được chấp nhận là không thể nữa nhưng nó có thể dễ dàng được mở rộng với một phương pháp UnmarshalJSON:

func (t *Test) UnmarshalJSON(data []byte) error { 
    type testAlias Test 
    test := &testAlias{ 
    B: "default B", 
    } 

    _ = json.Unmarshal(data, test) 

    *t = Test(*test) 
    return nil 
} 

Các testAlias ​​là cần thiết để ngăn chặn các cuộc gọi đệ quy để UnmarshalJSON . Điều này làm việc vì một kiểu mới không có phương thức nào được định nghĩa.

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

Các vấn đề liên quan