【问题标题】:How to ignore data in JSON.NET that changes between returns如何忽略 JSON.NET 中在返回之间发生变化的数据
【发布时间】:2015-02-10 23:27:54
【问题描述】:

我正在解析第三方返回的 JSON 数据。

我的课程是使用 JSON2CSharp 生成的,它适用于我们收到的第一个示例。我对其进行了调整,使其具有一些 JsonProperty 设置,因此它不需要某些并不总是存在的属性。

现在我收到了更多样本,其中一个数据块更改了格式

需要

public Translations Translations { get; set; }

public List<Translations> Translations { get; set; }

然而,blob 是我们不需要的信息,对于性能和不必处理该信息以及我们不需要更改格式的其他信息,在反序列化它时忽略它是理想的。

现在真正的问题是,“JsonIgnore”是否应该忽略整个数据块,而不管其格式是否与类中定义的格式不同?还是我必须围绕它进行编程?

如果我这样做了

[JsonIgnore]
public string Translations { get; set; }

当它收到一个列表或一个对象时,它是否也会忽略翻译?

我可以在 JsonIgnore 中使用与 JsonProperty 相同的语法,然后说

[JsonIgnore(PropertyName = "translations")]

还是 JsonIgnore 只是扔掉它收到的任何东西?

补充问题:

是否约定当没有翻译时,我得到:

"translations":[]

当我得到翻译时:

"translations":{"CA":"blabla","DD":"C : blablah"}

或者这可能是第三方网站的错误?

添加:

1:Translations 可以在每次提取 JSON 之间在字符串、列表和对象之间切换。

2:对于使用 DataMembers 忽略我实际上不需要的所有内容,在具有子类的类中,我必须告诉它子类是 [DataMember] 还是子类属性是 [DataMember]?

【问题讨论】:

    标签: c# json deserialization


    【解决方案1】:

    我会使用DataContractAttributeDataMemberAttributes 为您实际想要反序列化的成员明确指定我想要在我的数据类中序列化/反序列化的属性。

    这是可选的,因此不会尝试将 JSON 中的任何额外内容硬塞到数据类中,并且数据类中的任何额外内容都不会显示在序列化的 JSON 中。

    所以假设你的班级现在看起来像这样:

    class MyData {
        // Old member
        // public Translations Translations { get; set; }
    
        public List<Translation> Translations { get; set; }
    
        public string ThisShouldBeSerialized { get; set; }
    }
    

    您可以对其进行更改,以便将您想要序列化的内容明确标记为此类,并且默认情况下忽略任何未标记为序列化的内容:

    [DataContract]
    class MyData {
        // Old member
        // public Translations Translations { get; set; }
    
        public List<Translation> Translations { get; set; }
    
        [DataMember]
        public string ThisShouldBeSerialized { get; set; }
    }
    

    然后:

    var myJSON = @"{ 
        'ThisShouldBeSerialized': 'test', 
        'Translations': { 
             'Some' : 'Strange', 
             'Data' : 'Blob' 
         }
    }";
    
    var result = JsonConvert.DeserializeObject<MyData>(myJSON);
    

    【讨论】:

    • 问题是在获取之间,成员可以在对象、列表和简单字符串之间来回切换。但是,如果我理解正确,无论它具有什么格式,在使用 DataMembers 时,它都会忽略任何未定义为成员的内容?如果你使用子类怎么办?
    • @Enlightend 由于Translations在反序列化过程中被完全忽略,我不清楚为什么它在和对象之间切换很重要。
    • 这就是我需要知道的。如果它被完全忽略,那么你的答案就完美了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 2014-11-24
    • 2018-08-26
    • 2016-08-27
    • 2020-11-06
    • 1970-01-01
    • 2016-08-31
    相关资源
    最近更新 更多