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

如何将空字符串反序列化为CustomType实例而非null?(Newtonsoft JSON)

解决Newtonsoft.Json空字符串反序列化为对象实例的问题

Newtonsoft.Json默认会将空字符串视为无效JSON,直接返回null。要实现空字符串反序列化为CustomType的新实例,你需要正确编写并注册自定义JSON转换器,以下是可行方案:

1. 编写通用空字符串转实例转换器

创建一个泛型转换器,处理所有具备无参构造函数的类型:

public class EmptyStringToInstanceConverter<T> : JsonConverter where T : new()
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(T).IsAssignableFrom(objectType);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // 空字符串解析时,Reader的TokenType为JsonToken.None,直接返回新实例
        if (reader.TokenType == JsonToken.None)
        {
            return new T();
        }
        
        // 非空JSON时正常反序列化
        return serializer.Deserialize<T>(reader);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        // 序列化逻辑保持默认即可
        serializer.Serialize(writer, value);
    }
}

2. 注册转换器的两种方式

方式一:通过特性标记目标类

直接在CustomType上添加转换器特性,全局生效:

[JsonConverter(typeof(EmptyStringToInstanceConverter<CustomType>))]
public class CustomType
{
    public int Id { get; set; }
    public string Name { get; set; }
}

// 调用测试
var result = JsonConvert.DeserializeObject<CustomType>("");
// result 为新的CustomType实例,而非null

方式二:序列化时指定转换器

如果不想修改类定义,可在调用时通过JsonSerializerSettings传入转换器:

var settings = new JsonSerializerSettings
{
    Converters = { new EmptyStringToInstanceConverter<CustomType>() }
};

var result = JsonConvert.DeserializeObject<CustomType>("", settings);

常见问题排查

你之前自定义ReadJson未生效,大概率是以下原因:

  • 未正确判断JsonToken.None状态(空字符串解析时的Token类型)
  • CanConvert方法未返回true(未匹配目标类型)
  • 未正确注册转换器(既没加特性,也没在设置中添加)

内容的提问来源于stack exchange,提问作者Kaushik Ravi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 15:27:39