文章摘要
这篇文章介绍了如何在.NET Core中使用自定义JsonConverter来解决反序列化不同数据类型的问题。以下是总结:
1. **问题背景**:
- 在Spring Boot中使用FastJSON时,实体类属性定义为String,可以自动转换JSON字符串和数字为String。
- 在.NET Core中,实体类属性为String时,无法直接反序列化为数字类型,导致抛出异常。
2. **解决方法**:
- 使用`JsonSerializerOptions`参数和`JsonConverter`类来自定义反序列化逻辑。
- 创建自定义转换器类(如IntJsonConverter),继承自`JsonConverter<string>`,在`Read`方法中处理不同JSON数据类型(数字或字符串)。
3. **步骤**:
- 创建自定义转换器类,并重写`Read`方法,处理数字转decimal再转字符串,或直接读取字符串。
- 在实体类属性上添加`JsonConverter`注解,指定自定义转换器。
- 配置反序列化选项`JsonSerializerOptions`,添加自定义转换器。
- 使用反序列化方法,无需额外配置即可处理不同数据类型。
4. **示例代码**:
```csharp
public class IntJsonConverter : JsonConverter<string>
{
public override string? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.Number)
{
return reader.GetDecimal().ToString();
}
else
{
return reader.GetString();
}
}
}
```
5. **配置反序列化**:
```csharp
var serializeOptions = new JsonSerializerOptions
{
WriteIndented = true,
};
serializeOptions.Converters.Add(new IntJsonConverter());
```
6. **实体类注解**:
```csharp
public class FsiResponse
{
[JsonConverter(typeof(IntJsonConverter))]
public string? infcode { get; set; }
}
```
7. **测试**:
- 使用控制台输出反序列化结果,验证infcode是否正确转换为字符串或数字。
通过这篇文章,可以掌握在.NET Core中自定义JSON转换器的使用方法,灵活处理不同数据类型,提升开发效率。
目录场景描述通过JsonSerializerOptions参数,绑定JsonConverter来实现在实体类的属性上 增加JsonConverter注解来实现
参考官方文档
例如api返回了以下json串 (infcode的值有可能时string 也可能时number
有时候返回时这个
{
“infcode”: -1,
“detail_msg”: null
}
有时后也可能时这个
{
“infcode”: “-1”,
“detail_msg”: null
}
本人之前在springboot开发的时候,使用的是fastjson,所以,只要在实体类定义属性为String,那么无论是number还是字符串,都会转换成String.
但是,到了.netcore这边的就不太管用了. 如果实体类定义是string, json字段是number的话.会抛出异常
默认的反序列的写法 (以下),会报错,不能直接将number转成string
实体类变量=JsonSerializer.Deserialize<实体类类型>(jsonString);
要想实现无论是number还是字符串, 都能够反序列化成功的话.这里就需要用到JsonConverter来实现了.这里介绍两种比较直观的写法
通过JsonSerializerOptions参数,绑定JsonConverter来实现在实体类的属性上 增加JsonConverter注解来实现 (不确定在C#是不是叫注解,在java中是叫注解) 这里新建一个类,例如取名为IntJsonConverter.cs .让其继承JsonConverter.然后重写Read方法.下面是关键部分代码public class IntJsonConverter : JsonConverter<string> //这里因为实体类的属性是string 这里就配置储层string
{
public override string? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType==JsonTokenType.Number)
{
//这里就简单处理以下 如果时number, 转换为decimal后在toString即可
return reader.GetDecimal().ToString();
}
else
{
return reader.GetString();
}
}
}
4.然后再需要转换的地方 配置以下反序列化的选项JsonSerializerOptions
var serializeOptions=new JsonSerializerOptions
{
WriteIndented=true,
};
serializeOptions.Converters.Add(new IntJsonConverter());
fsiResponse=JsonSerializer.Deserialize<FsiResponse>(contentStream, serializeOptions);
5.这样就可以了
同样需要自定义一个JsonConverter类 ,同刚才的步骤.在实体类上,增加注解,只向这个转换器 public class FsiResponse
{
[JsonConverter(typeof(IntJsonConverter))]
public string? infcode { get; set; }
3.然后反序列化的时候, 按照默认的写法即可
fsiResponse=JsonSerializer.Deserialize<FsiResponse>(contentStream);
到此这篇关于.Net 自定义转换器JsonConverter的使用详解的文章就介绍到这了,更多相关.net 自定义转换器JsonConverter内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:ASP.NET2.0服务器控件之类型转换器使用JsonConverter处理上传文件的路径问题