【问题标题】:Deserialize an array inside a json object using JsonConvert.DeserializeObject()使用 JsonConvert.DeserializeObject() 反序列化 json 对象内的数组
【发布时间】:2020-12-04 06:24:38
【问题描述】:

我有一个要求,我有以下格式的传入 json 对象:

{
   "CustomerList": {
       "Customer": [{
            "CustomerCode" : "C123",
            "CustomerName" : "Peter"
       },
       {
            "CustomerCode" : "C456",
            "CustomerName" : "John"
       }]
   }
}

我有以下格式的 C# 对象:

[System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = "false")]
public Customer[] CustomerList
{
   get; set;
}

[System.Xml.Serialization.XmlTypeAttribute()]
public class Customer
{
    public string CustomerCode {get; set;}
    public string CustomerName {get; set;}
}

在使用 JsonConvert.DeserializeObject() 进行反序列化期间,我收到以下错误: 无法将当前 JSON 对象反序列化为 Customer[] 类型,因为该类型需要 JSON 数组(例如 [1,2,3])才能正确反序列化。

就我而言,限制是我不能更改传入的 JSON 对象,也不能修改 C# 对象结构。那么问题来了,有没有办法将传入 Json 中的 Customer 节点直接映射到 CustomerList C# 数组,而无需重命名或更改其中任何一个的结构?

【问题讨论】:

  • public Customer[] CustomerList 这是在某个类中声明的!能分享一下反序列化的代码吗?
  • 是 CustomerList 在类中声明。我没有使用任何自定义反序列化。我只是在 Newtonsoft.Json 库中使用 JsonConvert.DeserializeObject()
  • 您需要共享执行反序列化的代码。不管多么简单。它将帮助我们查看代码是否存在问题,并可以相应地提出解决方案。现在看起来您正在反序列化为错误的类型,但没有查看您的代码,这只是一个假设
  • 我正在使用通用库,可在此处获得:newtonsoft.com/json,所以它应该没有任何问题

标签: c# xml-parsing xml-serialization json-deserialization jsonserializer


【解决方案1】:

根据您共享的 JSON,您需要具有以下类结构。

public class Customer    {
    public string CustomerCode { get; set; } 
    public string CustomerName { get; set; } 
}

public class CustomerList    {
    public List<Customer> Customer { get; set; } 
}

public class RootObject  {
    public CustomerList CustomerList { get; set; } 
}

然后您需要按如下方式反序列化 JSON。

RootObject obj = JsonConvert.DeserializeObject<RootObject>(jsonString);

这里jsonString是字符串变量,它有JSON字符串。

希望这能帮助您解决问题。

【讨论】:

    【解决方案2】:

    要反序列化 JSON 对象,您需要创建一个类似的 C# 类。

    public class JsonObjectTest {
        [JsonPropertyName("CustomerList")]
        public Customer CustomerPreList {get;set;}
    }
    
    public class Customer {
        public List<CustomerObject> Customer {get;set;}
    }
    
    public class CustomerObject {
    
        public string CustomerCode { get; set; }
        public string CustomerName { get; set; }
    }
    

    然后反序列化 JSON 对象:

    CustomerList xmlData = JsonConvert.DeserializeObject<JsonObjectTest>(jsonObjectString).Select(data => 
        new CustomerList = data.CustomerPreList.toArray());
    

    很遗憾,我无法询问您是否有权创建新课程(我需要更多积分)。如果是这种情况,请尝试使用 AutoMapper 为这种特定情况创建映射策略。

    编码愉快:)

    【讨论】:

    • 如果C#类有不同的结构,有没有办法映射。例如。通过使用 [System.Xml.Serialization.XmlElementAttribute("CustomerList.Customer")][System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = "false")] public Customer[] CustomerList { get;放; }
    猜你喜欢
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 2013-08-14
    • 2017-07-31
    • 2022-01-04
    • 2016-05-23
    相关资源
    最近更新 更多