【问题标题】:c# DataContractJsonSerializer returns nullc# DataContractJsonSerializer 返回 null
【发布时间】:2016-07-17 12:25:59
【问题描述】:

你好,我有这个代码:

通过 HttpClient 我收到这个 json 字符串:

{"group":3,"data":[{"count":1,"providerName":"BetaDigital","providerNo":12},{"count":139,"providerName":"Free to air","providerNo":1}]}


            var serializer = new DataContractJsonSerializer(typeof(GroupProvider));
            var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));

            var data = (GroupProvider) serializer.ReadObject(ms);

然后我有这些课程:

[DataContract]
public class GroupProvider 
{
    public int Group { get; set; }
    public DataGroupProvider[] data { get; set; }
}

[DataContract]
public class DataGroupProvider 
{

    public int Count { get; set; }
    public string ProviderName { get; set; }
    public int ProviderNo { get; set; }
}

问题是,只有 Group 被填充,而 DataGroupProvider 为 null..

问题出在哪里?

【问题讨论】:

    标签: c# json serialization datacontractjsonserializer


    【解决方案1】:

    Data Contract Basics 中所述,您要么不放置DataContract 属性,在这种情况下将考虑每个公共属性或字段(但请注意名称应完全匹配)或放置DataContract 属性然后您需要使用DataMember 属性显式标记要考虑的成员。后者还允许您更改名称映射。

    因此,您的示例 JSon 可以使用以下任一数据模型进行反序列化(注意属性名称大小写):

    public class GroupProvider
    {
        public int group { get; set; }
        public DataGroupProvider[] data { get; set; }
    }
    
    public class DataGroupProvider
    {
        public int count { get; set; }
        public string providerName { get; set; }
        public int providerNo { get; set; }
    }
    

    或保留您当前的属性名称:

    [DataContract]
    public class GroupProvider
    {
        [DataMember(Name = "group")]
        public int Group { get; set; }
        [DataMember]
        public DataGroupProvider[] data { get; set; }
    }
    
    [DataContract]
    public class DataGroupProvider
    {
        [DataMember(Name = "count")]
        public int Count { get; set; }
        [DataMember(Name = "providerName")]
        public string ProviderName { get; set; }
        [DataMember(Name = "providerNo")]
        public int ProviderNo { get; set; }
    }
    

    【讨论】:

      【解决方案2】:

      像这样设置 DataMember-Attribute:

      [DataContract]
      public class GroupProvider
      {
          [DataMember]
          public int Group { get; set; }
          [DataMember]
          public DataGroupProvider[] data { get; set; }
      }
      
      [DataContract]
      public class DataGroupProvider
      {
      
          [DataMember]
          public int Count { get; set; }
          [DataMember]
          public string ProviderName { get; set; }
          [DataMember]
          public int ProviderNo { get; set; }
      }
      

      然后将您的 JSON 更改为正确的:

      var str ="{\"Group\":3,\"data\":[{\"Count\":1,\"ProviderName\":\"BetaDigital\",\"ProviderNo\":12},{\"Count\":139,\"ProviderName\":\"Free to air\",\"ProviderNo\":1}]}";

      JSON 数据 区分大小写

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 2014-04-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多