go json.Unmarshal 如何判断里面指定字段的错误
时间: 2024-04-23 09:22:06 浏览: 274
在Go语言中,可以使用自定义的结构体类型来表示JSON对象,并使用`json.Unmarshal()`函数将JSON字符串解析为该结构体类型的对象。如果JSON字符串中包含了不合法的字段或者不符合结构体定义,我们需要进行错误处理。
对于指定字段的错误处理,可以在结构体定义中使用`json`标签进行指定。例如,假设我们有一个JSON对象:
```json
{
"name": "张三",
"age": "18",
"gender": "男"
}
```
其中,`age`字段的值是一个字符串,但是我们的结构体定义中将其定义为了一个整型字段。在这种情况下,`json.Unmarshal()`函数会将`age`字段的值解析为一个整型数值并赋值给结构体中的`Age`字段。但是由于`age`字段的值是一个字符串,不符合整型的定义,因此会在`json.Unmarshal()`函数中产生一个错误,我们需要进行错误处理。
我们可以在结构体定义中为`Age`字段指定一个`string`类型的`json`标签,表示将`age`字段的值解析为一个字符串并赋值给`Age`字段。如果字段解析失败,`json.Unmarshal()`函数会将错误信息保存在`json.UnmarshalTypeError`类型的错误值中,并将该错误值作为`Unmarshal()`函数的返回值返回。我们可以通过判断该错误值的类型来区分指定字段的错误。
例如,假设我们有以下结构体类型:
```go
type Person struct {
Name string `json:"name"`
Age int `json:"age,string"`
Gender string `json:"gender"`
}
```
在`Age`字段的`json`标签中指定了`string`类型,表示将`age`字段的值解析为一个字符串。现在我们可以使用以下代码将JSON字符串解析为`Person`对象,并判断`Age`字段解析是否出错:
```go
var p Person
err := json.Unmarshal([]byte(jsonStr), &p)
if err != nil {
if e, ok := err.(*json.UnmarshalTypeError); ok {
if e.Field == "age" && e.Value != "null" {
fmt.Printf("解析age字段出错,期望类型:%s,实际类型:%s\n", e.Type, e.Value)
return
}
}
fmt.Println("解析JSON字符串失败:", err.Error())
return
}
```
在上述代码中,我们首先判断`json.Unmarshal()`函数的返回错误是否为`nil`,如果不为`nil`,则判断错误类型是否为`*json.UnmarshalTypeError`类型。如果是,则说明是指定字段的解析错误,我们可以根据该错误类型的`Field`和`Value`字段来判断具体的错误原因。如果`Field`字段的值为`age`且`Value`字段的值不为`null`,则说明`age`字段的值不是一个合法的整型值。如果不是指定字段的解析错误,则说明JSON字符串的格式不正确,打印错误信息并退出。
阅读全文