您的位置:首页技术文章

ASP.Net 自定义转换器JsonConverter的使用详解

【字号: 日期:2023-07-12 16:32:11浏览:5作者:馨心

例如api返回了以下json串 (infcode的值有可能时string 也可能时number


有时候返回时这个

{

"infcode": -1,

"detail_msg": null

}

有时后也可能时这个

{

"infcode": "-1",

"detail_msg": null

}

本人之前在springboot开发的时候,使用的是fastjson,所以,只要在实体类定义属性为String,那么无论是number还是字符串,都会转换成String.


但是,到了.netcore这边的就不太管用了. 如果实体类定义是string, json字段是number的话.会抛出异常The JSON value could not be converted to System.String


默认的反序列的写法 (以下),会报错,不能直接将number转成string


实体类变量= JsonSerializer.Deserialize<实体类类型>(jsonString);


要想实现无论是number还是字符串, 都能够反序列化成功的话.这里就需要用到JsonConverter来实现了.这里介绍两种比较直观的写法


通过JsonSerializerOptions参数,绑定JsonConverter来实现

在实体类的属性上 增加JsonConverter注解来实现 (不确定在C#是不是叫注解,在java中是叫注解)


通过JsonSerializerOptions参数,绑定JsonConverter来实现

这里新建一个类,例如取名为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();

}

}

}


然后再需要转换的地方 配置以下反序列化的选项JsonSerializerOptions

var serializeOptions = new JsonSerializerOptions

{

WriteIndented = true,

};

serializeOptions.Converters.Add(new IntJsonConverter());

fsiResponse = JsonSerializer.Deserialize<FsiResponse>(contentStream, serializeOptions);


这样就可以了

在实体类的属性上 增加JsonConverter注解来实现

同样需要自定义一个JsonConverter类 ,同刚才的步骤.

在实体类上,增加注解,只向这个转换器

public class FsiResponse

{

[JsonConverter(typeof(IntJsonConverter))]

public string? infcode { get; set; }

然后反序列化的时候, 按照默认的写法即可


fsiResponse = JsonSerializer.Deserialize<FsiResponse>(contentStream);

标签: ASP.NET
相关文章: