2015-05-25 18 views
11

Chcę parsować obiekt JSON w Go, ale chcę określić wartości domyślne dla pól, które nie są podane. Na przykład, mieć struct:Jak określić wartości domyślne podczas analizowania JSON w Go

type Test struct { 
    A string 
    B string 
    C string 
} 

domyślne wartości dla A, B i C: "a", "b" i "c", odpowiednio. Oznacza to, że kiedy analizowania JSON:

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

Chcę uzyskać struct:

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

Czy jest to możliwe za pomocą wbudowanego w pakiet encoding/json? W przeciwnym razie, czy istnieje biblioteka Go, która ma tę funkcjonalność?

Odpowiedz

37

Jest to możliwe przy użyciu kodowania/json: podczas wywoływania json.Unmarshal, nie trzeba nadawać pustej strukturze, można nadać mu wartość domyślną.

Dla przykładu:

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) 

Running this example in the Go playground powraca {A:1 B:default b C:3}.

Jak widać, json.Unmarshal(example, &out) unmarshals JSON do out, zastępując wartości określone w JSON, ale pozostawiając pozostałe pola niezmienione.

3

W przypadku u mają listy lub mapę Test elemencie przyjętą odpowiedź nie jest już możliwe, ale może być łatwo rozbudowany o sposobie 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 
} 

potrzebna jest testAlias ​​aby zapobiec rekurencyjnych wywołań UnmarshalJSON . Działa to, ponieważ nowy typ nie ma zdefiniowanych metod.

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

Powiązane problemy