How to specify default values when parsing JSON in Go

前端 未结 2 1638
囚心锁ツ
囚心锁ツ 2020-12-09 08:16

I want to parse a JSON object in Go, but want to specify default values for fields that are not given. For example, I have the struct type:

type Test struct          


        
相关标签:
2条回答
  • 2020-12-09 08:30

    In case u have a list or map of Test structs the accepted answer is not possible anymore but it can easily be extended with a UnmarshalJSON method:

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

    The testAlias is needed to prevent recursive calls to UnmarshalJSON. This works because a new type has no methods defined.

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

    0 讨论(0)
  • 2020-12-09 08:34

    This is possible using encoding/json: when calling json.Unmarshal, you do not need to give it an empty struct, you can give it one with default values.

    For your example:

    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 returns {A:1 B:default b C:3}.

    As you can see, json.Unmarshal(example, &out) unmarshals the JSON into out, overwriting the values specified in the JSON, but leaving the other fields unchanged.

    0 讨论(0)
提交回复
热议问题