首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在反序列化期间忽略目标模型类中不存在的JSON枚举值

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

Stack Overflow用户
提问于 2017-06-14 01:33:51
回答 3查看 2.1K关注 0票数 1

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

代码语言:javascript
复制
public List<StatModel> Stats { get; set; }

每个StatModel都有一个与名称基本相同的属性:

代码语言:javascript
复制
public Stat Stat { get; set; }

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

代码语言:javascript
复制
[EnumMember(Value = "Avg Walk Distance")]
AverageWalkDistance,

现在的问题是,如果实际API中有什么变化,包装器就不能工作,因为它没有为指定的Stat定义。因此,这意味着如果他们向API添加了一个新的Stat,包装器将不会工作,直到我手动为它添加定义,就像上面的代码块一样。

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

为了更好地理解我的实际意思,这里有一个关于GitHub的项目:https://github.com/eklypss/PUBGSharp

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

EN

回答 3

Stack Overflow用户

发布于 2017-06-14 03:15:35

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

代码语言:javascript
复制
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. ,反序列化"label“成员时使用

如果是,则接受该异常。您还可以利用这个机会在模型中设置一个标志,指示Stat属性无效。

票数 2
EN

Stack Overflow用户

发布于 2017-06-14 01:52:56

您可以让json.net忽略缺少的成员。

代码语言:javascript
复制
var settings = new JsonSerializerSettings
{
    NullValueHandling = NullValueHandling.Ignore,
    MissingMemberHandling = MissingMemberHandling.Ignore
};

var json = JsonConvert.DeserializeObject<MyClass>(jsonStr, settings);
票数 0
EN

Stack Overflow用户

发布于 2017-06-14 03:54:45

参考下面的问题,这个人和你有同样的问题。

How can I ignore unknown enum values during json deserialization?

然而,

即使您设法忽略了新的Stat,这对包装器也没有好处,因为包装器的使用者需要等待您添加新的Enum

所以,

如果我是你,我会考虑将StatEnum改为string,这样无论何时有新的Stat到来,您都不需要更改任何东西,也不需要更改包装器的使用者,而不必等待。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44528056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档