【问题标题】:Json.net deserialization with ignore DataMember(Name) attribute具有忽略 DataMember(Name) 属性的 Json.net 反序列化
【发布时间】:2017-07-11 08:42:19
【问题描述】:

我有一堂课如下。

[Datacontract]
public class Customer
{
    [DataMember(Name="p1")]
    public string Name { get; set; }

    [DataMember(Name = "p2")]
    public string SurName { get; set; }        
}

案例 1

json:{"Name":"John","SurName":"Asdf"}

反序列化对象: customer.Name => null 和 customer.SurName => null

案例 2

Json: {"p1":"John","p2":"Asdf"}

反序列化对象: customer.Name => John 和 customer.SurName=> Asdf

问题:

我有 Case1 中的 json => {"Name":"John","SurName":"Asdf"}

我在 Case2 中等待反序列化的对象 =>
customer.Name => John 和 customer.SurName=> Asdf

那么,我如何在反序列化期间提供忽略 DataMember(Name) 属性的功能?

已解决:

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        var property = base.CreateProperty(member, memberSerialization);
        property.PropertyName = member.Name;

        return property;
    }

谢谢@dbc

【问题讨论】:

  • 看起来像 Configure JSON.NET to ignore DataContract/DataMember attributes 的副本。这是否充分回答了您的问题?
  • 不完全是。我尝试忽略 DataMember 属性的 Name 字段。 [DataMember(Name="p1")] 在这里,Name="p1" 是反序列化错误。
  • 所以你想尊重[DataContract][DataMember]属性除了你想忽略DataMember.Name? (哦,对了,你的Customer类型也必须标上[DataContract];你能确认一下吗?)
  • 是的。因为我没有机会更改客户类别。因此我无法将 JsonObject 属性添加到 CustomerClass 属性。
  • 完全忽略数据合约属性,如图here 不够好?例如类Customer 应该足够了。你有一个例子表明这还不够好吗?

标签: asp.net-mvc asp.net-web-api json.net asp.net-web-api2 json-deserialization


【解决方案1】:

你能用下面的反序列化它吗? :

var customerModelData = JsonConvert.DeserializeObject<Customer>(jsonCustomerData);

【讨论】:

  • 是的。但是虽然 json 中的 Name 或 Surname 属性有值,但反序列化对象的值为 Null。因为属性具有带有名称字段的数据成员属性。 Json 反序列化器等待 p1 或 p2 属性。但我的 Json 有 Name 和 Surname 属性。
【解决方案2】:

以这种方式定义类属性:

[JsonProperty(Required = Newtonsoft.Json.Required.AllowNull)]
public string Name  { get; set;}

【讨论】:

  • 我没有机会换班
猜你喜欢
  • 2016-08-27
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 2013-04-07
相关资源
最近更新 更多