在Go中解析JSON时如何指定默认值

在Go中解析JSON时如何指定默认值,json,go,Json,Go,我想在Go中解析JSON对象,但想为未给定的字段指定默认值。例如,我有结构类型: type Test struct { A string B string C string } A、B和C的默认值分别为“A”、“B”和“C”。这意味着当我解析json时: {"A": "1", "C": 3} 我要获取结构: Test{A: "1", B: "b", C: "3"} 使用内置包encoding/json是否可以实现这一点?否则,是否有任何Go库具有此功能?这可以使用编

我想在Go中解析JSON对象,但想为未给定的字段指定默认值。例如,我有结构类型:

type Test struct {
    A string
    B string
    C string
}
A、B和C的默认值分别为“A”、“B”和“C”。这意味着当我解析json时:

{"A": "1", "C": 3}
我要获取结构:

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

使用内置包
encoding/json
是否可以实现这一点?否则,是否有任何Go库具有此功能?

这可以使用编码/json实现:调用
json.Unmarshal
时,不需要为其提供空结构,可以为其提供一个默认值

例如:

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)
var示例[]字节=[]字节(`{“A”:“1”,“C”:“3”}`)
输出:=测试{
A:“默认A”,
B:“默认B”,
//C的默认值为“”,即字符串的空值
}

err:=json.Unmarshal(示例,&out)/如果您有一个
Test
structs的列表或映射,则接受的答案不再可能,但可以使用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
}
需要testAlias来防止对解组JSON的递归调用。这是因为新类型没有定义方法


如果out是一个数组,而您不知道json中有多少元素,该怎么办。