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

C#中JSON反序列化为对象时属性不匹配如何抛出并捕获错误?

实现JSON属性与C#类属性不匹配时抛出错误的方案

这个需求完全可以实现,通过配置System.Text.Json的序列化选项即可达成。

核心配置要点

默认情况下System.Text.Json会忽略JSON中C#类未定义的属性,也不会因C#类属性在JSON中缺失报错。要触发属性不匹配错误,需调整两个关键设置:

  • UnknownTypeHandling:将JsonSerializerOptions的该属性设为JsonUnknownTypeHandling.JsonException,JSON中出现C#类未定义的属性时就会抛出异常。
  • [JsonRequired]特性:给C#类的属性添加该特性,强制要求JSON中必须包含对应属性,缺失时直接抛出异常。

修改后的完整C#代码

// See https://aka.ms/new-console-template for more information

using static System.Console;
using System.Text.Json;
using System.Text.Json.Serialization;

List<Person> source = new List<Person>();

// 配置反序列化选项
var options = new JsonSerializerOptions
{
    UnknownTypeHandling = JsonUnknownTypeHandling.JsonException,
    PropertyNameCaseInsensitive = false // 可选:开启严格大小写匹配,大小写不匹配也视为属性不匹配
};

try
{
    using (StreamReader r = new StreamReader("data.json"))
    {
        string json = r.ReadToEnd();
        source = JsonSerializer.Deserialize<List<Person>>(json, options);

        foreach (Person person in source)
        {
            WriteLine(person.Id);
        }
    }
}
catch (JsonException ex)
{
    WriteLine($"JSON反序列化错误:{ex.Message}");
}

public class Person
{    
    [JsonRequired]
    public int Id { get; set; }
    [JsonRequired]
    public string Firstname { get; set; }
    [JsonRequired]
    public string Lastname { get; set; }
    [JsonRequired]
    public string City { get; set; }
}

触发错误的典型场景

  1. JSON中包含C#类未定义的属性:比如给JSON对象添加"Age":30,反序列化时会抛出JsonException提示存在未知属性。
  2. JSON缺失C#类标记了[JsonRequired]的属性:比如某个JSON对象去掉"City"字段,会触发必填属性缺失的异常。
  3. 开启严格大小写匹配后,JSON属性名与C#类属性名大小写不一致:比如JSON写"firstname"而C#类是Firstname,会被判定为属性缺失抛出错误。

补充说明

如果不需要严格区分属性大小写,可将PropertyNameCaseInsensitive设为true(默认值),此时只有属性名完全不存在或缺失必填项时才会报错。捕获JsonException即可处理所有属性不匹配导致的反序列化错误。

内容的提问来源于stack exchange,提问作者Musaffar Patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 22:15:40