c# - 在反序列化期间忽略目标模型类中不存在的 JSON 枚举值

标签 c# json serialization json.net deserialization

所以我正在使用 C# 开发 API 包装器,我使用 Newtonsoft.Json 库将 JSON 数据反序列化为响应模型类。在响应模型类中,我有一个子项列表,每个子项都包含一个子项列表。它们的定义如下:

public List<StatModel> Stats { get; set; }

每个 StatModel 都有一个基本上等于名称的属性:

public Stat Stat { get; set; }

这些会自动反序列化,因为每个 Stat 都是在如下枚举中定义的:

[EnumMember(Value = "Avg Walk Distance")]
AverageWalkDistance,

现在的问题是,如果实际 API 发生变化,包装器将无法工作,因为它没有指定 Stat 的定义。因此,这意味着如果他们向 API 添加新的 Stat,则包装器将无法工作,除非我手动为其添加定义,如上面的代码块所示。

所以问题是,我如何忽略没有相应 Stat 属性可用的值,或者我可以以某种方式重新设计整个事情,这样就不会发生这种情况?我想无论如何我都必须自己定义所有新值。

这是 GitHub 上的项目,可以更好地理解我的实际意思:https://github.com/eklypss/PUBGSharp

请求者进行反序列化并返回一个 StatResponse,其中有一个名为 StatsRoot 的子项列表,每个子项都有自己的 StatModel 列表,这些 StatModel 是导致此问题的实际统计对象。每种类型的 Stat 都在 Enum/Stat.cs 文件中定义。

最佳答案

如果您不想创建自己的容忍版本 StringEnumConverter ,您可以使用 Json.NET 的 exception handling特点:

public class StatModel
{
    const string StatName = "label";

    [JsonProperty(StatName)]
    [JsonConverter(typeof(StringEnumConverter))]
    public Stat Stat { get; set; }

    public string Value { get; set; }
    public int? Rank { get; set; }
    public double? Percentile { get; set; }

    [OnError]
    void OnError(StreamingContext context, ErrorContext errorContext)
    {
        if (errorContext.OriginalObject == this && StatName.Equals(errorContext.Member))
        {
            errorContext.Handled = true;
        }
    }
}

当反序列化 StatModel 或其任何嵌套对象时引发异常时,将调用其 OnError() 方法来处理错误。该方法检查是否抛出异常

  1. 反序列化此特定对象时,并且
  2. 反序列化“label”成员时。

如果是这样,异常就会被吞掉。您还可以借此机会在模型中设置一个标志,指示 Stat 属性无效。

关于c# - 在反序列化期间忽略目标模型类中不存在的 JSON 枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44528056/

相关文章:

c# - .NET 和 MySQL 中 SHA1 的区别

json - 如何在 IntelliJ IDEA 中复制 JSON 中的路径?

ios - 如何从 web 服务处理 JSON 中的撇号?

.net - Json.NET 可以对流进行序列化/反序列化吗?

c# - 创建流畅的 API

c# - 绘制透明按钮

javascript - 创建和循环 json 对象时出现问题

c# - Xml 序列化后代列表

java - 更改 gson 中的默认枚举序列化和反序列化

c# - 在指定列上连接两个列表