【问题标题】:Deserialize JSON to C# object does not assign the values将 JSON 反序列化为 C# 对象不分配值
【发布时间】:2021-05-06 14:05:41
【问题描述】:

我有以下Contacts JSON 数据-

{
    "currentPage": 1,
    "totalPages": 1,
    "elementsOnPage": 0,
    "totalElements": 1,
    "contacts": [
        {
            "id": "9bf83fab-a485-495c-8e1f-b32c8fe9b9c6",
            "version": 1,
            "type": 2
        }
    ]
}

在C#下面Contacts类与JSON进行映射-

public class Contacts
    {
       
        public System.Guid id { get; set; }

        public long version { get; set; }
      
        public ContactType type { get; set; }
    }

DeserializeJSON,我写了下面的代码-

Contacts contacts = JsonConvert.DeserializeObject<Contacts>(ContactsJson);

json 只不过是上面在C# 中给出的Contacts JSON

现在,当我检查contacts object 时,所有值都是null,没有值分配给object properties。我错过了什么吗?请提供帮助或建议。

注意-我不想得到currentPagetotalPageselementsOnPagetotalElements的值

TIA

【问题讨论】:

  • 父对象(即currentPage和联系人数组)中字段的类型定义在哪里?

标签: c# json deserialization jsonconvert


【解决方案1】:

当你这样做时:

Contacts contacts = JsonConvert.DeserializeObject<Contacts>(ContactsJson);

DeserializeObject 期望 json 看起来像 Contacts 类的实例。对那些东西不感兴趣也没关系,类的结构一定要和json匹配。 json 是一个包含 许多 联系人的对象。所以需要匹配:

试试这个:

public class Contact
{
    public System.Guid id { get; set; }
    public long version { get; set; }
    public ContactType type { get; set; }
}

public class ContactCollection
{
    public Contact[] contacts{ get; set; }
}

然后:

var contacts = JsonConvert.DeserializeObject<ContactCollection>(ContactsJson);

【讨论】:

    【解决方案2】:

    你可以像这样声明你的类,它会反序列化。

    public class Contact
    {
        public Guid id { get; set; } 
        public int version { get; set; } 
        public int type { get; set; } 
    }
    
    public class Contacts
    {
        public int totalElements { get; set; } 
        public List<Contact> contacts { get; set; } 
    }
    

    由于您使用的是 Newtonsoft JSON,请使用此

    Contacts contacts = JsonConvert.DeserializeObject<Contacts>(ContactsJson);
    

    【讨论】:

      【解决方案3】:

      你可以试试这个:

          JObject jObject = JObject.Parse(json);
      
          var contacts = jObject.SelectToken("contacts").First.ToObject<Contacts>();
      
      

      假设您的班级如下所示:

          public class Contacts
          {
      
              public Guid id { get; set; }
      
              public long version { get; set; }
      
              public int type { get; set; }
          }
      

      【讨论】:

        【解决方案4】:

        您可以使用此代码:

        var data = (JObject)JsonConvert.DeserializeObject(json);
        var contacts = data["contacts"].ToObject<List<Contacts>>();
        

        联系人类

        public class Contacts
        {
            public System.Guid id { get; set; }
            public long version { get; set; }
            public int type { get; set; }
        }
        

        【讨论】:

        • 您将联系人元素从数组更改为 json 文件中的对象!
        • @NajiMakhoul 可以映射每个元素,也可以只取一个特定元素,因为这个问题我选择了第二种模式。
        猜你喜欢
        • 2015-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-30
        • 2020-06-24
        • 1970-01-01
        相关资源
        最近更新 更多