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

如何修改Newtonsoft.Json反序列化空对象{}的默认行为?

如何修改Newtonsoft.Json反序列化空JSON的行为

可以修改这个行为,这里提供几种实现思路:

思路1:把空JSON对象反序列化为null

写一个自定义JsonConverter,判断输入的JSON是否是空对象,是的话直接返回null,否则正常反序列化:

public class TempConverter : JsonConverter<Temp>
{
    public override Temp ReadJson(JsonReader reader, Type objectType, Temp existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var jObject = JObject.Load(reader);
        if (!jObject.HasValues)
            return null;
        
        return jObject.ToObject<Temp>(serializer);
    }

    public override void WriteJson(JsonWriter writer, Temp value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }
}

使用时指定转换器:

var settings = new JsonSerializerSettings
{
    Converters = new List<JsonConverter> { new TempConverter() }
};
var obj = JsonConvert.DeserializeObject<Temp>("{}", settings);
// 此时obj为null

思路2:遇到空JSON对象时触发异常

同样用自定义转换器,检测到空JSON就抛出异常:

public class TempStrictConverter : JsonConverter<Temp>
{
    public override Temp ReadJson(JsonReader reader, Type objectType, Temp existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var jObject = JObject.Load(reader);
        if (!jObject.HasValues)
            throw new JsonSerializationException("空JSON对象无法转换为Temp实例");
        
        return jObject.ToObject<Temp>(serializer);
    }

    public override void WriteJson(JsonWriter writer, Temp value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }
}

调用示例:

var settings = new JsonSerializerSettings
{
    Converters = new List<JsonConverter> { new TempStrictConverter() }
};
try
{
    var obj = JsonConvert.DeserializeObject<Temp>("{}", settings);
}
catch (JsonSerializationException ex)
{
    // 处理异常逻辑
}

额外思路:标记必填属性触发异常

如果你的Temp类有必须赋值的属性,可以给这些属性添加[JsonProperty(Required = Required.Always)]特性,这样当JSON中缺少这些属性时(包括空JSON对象的情况),Newtonsoft.Json会直接抛出异常:

class Temp
{
    [JsonProperty(Required = Required.Always)]
    public string Field1 { get; set; }
    [JsonProperty(Required = Required.Always)]
    public int Field2 { get; set; }
    [JsonProperty(Required = Required.Always)]
    public bool Field3 { get; set; }
    // 其他属性...
}

此时反序列化"{}"会抛出JsonSerializationException,提示缺少必填的Field1、Field2等属性。

内容的提问来源于stack exchange,提问作者Валентин Никин

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:23:08