自定义JsonConverter触发JsonException:Read too much or not enough问题解决
问题:将JSON空数组反序列化为null时的JsonException问题
场景与需求
JSON属性值存在三种情况:
- null:
{ "some_obj" : null } - 空数组:
{ "some_obj" : [] } - 带属性的非空对象:
{ "some_obj" : {"name" : "nick"} }
需求:将空数组转换为null。
初始实现的转换器
为满足需求,自定义了JsonConverter<T>,但当输入为空数组时会抛出JsonException:"The converter {converter} read too much or not enough",null和非空对象场景下工作正常。
初始代码:
public class MyConverter<T> : JsonConverter<T> { public override T? Read( ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if(reader.TokenType == JsonTokenType.StartArray) { return default(T); } else if (reader.TokenType == JsonTokenType.StartObject) { return JsonSerializer.Deserialize<T>(ref reader, options); } else { return default(T); } } public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options) => JsonSerializer.Serialize(writer, (T?)value, options); }
类中使用转换器的方式
public class SomeClass { [JsonConverter(typeof(MyConverter<SomeObj>))] [JsonPropertyName("some_obj")] public SomeObj? SomeObj{ get; set; } } public class SomeObj { [JsonPropertyName("name")] public string? Name{ get; set; } }
解决方法(更新后的代码)
通过确保读取到JsonTokenType.EndArray再返回,解决了异常问题。修改后的Read方法:
public override T? Read( ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType == JsonTokenType.StartObject) { return JsonSerializer.Deserialize<T>(ref reader, options); } if (reader.TokenType == JsonTokenType.StartArray) { while (reader.Read()) { if (reader.TokenType == JsonTokenType.EndArray) { return default(T); } } } throw new JsonException(); }
内容的提问来源于stack exchange,提问作者Nick Heiting
相关产品推荐
相关产品推荐

