如何将JSON空对象{}转换为null以适配可空类模型?
解决API空JSON对象转null适配可空类型的问题
针对API返回的空JSON对象{}(包括嵌套字段中的空对象),可以通过自定义JSON转换器实现将其反序列化为null,适配你定义的可空类型类。以下是两种.NET主流JSON序列化库的实现方案:
方案一:使用Newtonsoft.Json(Json.NET)
1. 自定义空对象转null转换器
public class EmptyObjectToNullConverter : JsonConverter { public override bool CanConvert(Type objectType) { // 支持引用类型和可空值类型 return !objectType.IsValueType || Nullable.GetUnderlyingType(objectType) != null; } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var jObject = JObject.Load(reader); // 如果对象有属性,正常反序列化;否则返回null return jObject.Properties().Any() ? jObject.ToObject(objectType, serializer) : null; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { serializer.Serialize(writer, value); } }
2. 应用转换器
- 局部应用(单个属性):在需要处理的可空属性上标记特性
public class Foo { public int? Field1 { get; set; } public string? Field2 { get; set; } [JsonConverter(typeof(EmptyObjectToNullConverter))] public Bar? Field3 { get; set; } }
- 全局应用(所有空对象生效):配置序列化设置时添加转换器
var serializerSettings = new JsonSerializerSettings(); serializerSettings.Converters.Add(new EmptyObjectToNullConverter()); // 反序列化示例 var apiResponse = "{\"foo\":{\"field1\":123,\"field2\":\"somestring\",\"field3\":{}}}"; var fooInstance = JsonConvert.DeserializeObject<Foo>(apiResponse, serializerSettings); // 此时fooInstance.Field3为null
方案二:使用System.Text.Json(.NET Core/.NET 5+内置)
1. 自定义泛型转换器
public class EmptyObjectToNullConverter<T> : JsonConverter<T?> where T : class { public override T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.StartObject) { return JsonSerializer.Deserialize<T?>(ref reader, options); } // 解析JSON对象并检查是否有属性 using var jsonDoc = JsonDocument.ParseValue(ref reader); var rootElement = jsonDoc.RootElement; return rootElement.EnumerateObject().Any() ? JsonSerializer.Deserialize<T>(rootElement.GetRawText(), options) : null; } public override void Write(Utf8JsonWriter writer, T? value, JsonSerializerOptions options) { JsonSerializer.Serialize(writer, value, options); } }
2. 应用转换器
- 局部应用(单个属性):
public class Foo { public int? Field1 { get; set; } public string? Field2 { get; set; } [JsonConverter(typeof(EmptyObjectToNullConverter<Bar>))] public Bar? Field3 { get; set; } }
- 全局应用:
var serializerOptions = new JsonSerializerOptions(); serializerOptions.Converters.Add(new EmptyObjectToNullConverter<Bar>()); // 反序列化示例 var apiResponse = "{\"foo\":{}}"; var fooInstance = JsonSerializer.Deserialize<Foo>(apiResponse, serializerOptions); // 此时fooInstance为null
以上两种方案都能将API返回的空JSON对象{}转换为null,完美适配你定义的可空类型类。
内容的提问来源于stack exchange,提问作者ahanT
相关产品推荐
相关产品推荐

