You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 03:57:43