如何将Object类型的对象强制转换为List <anotherobject>

时间:2018-09-05 10:50:04

标签: c# json

我将尝试解释我的问题。我想在应用程序中将JSON反序列化为c#类。我的一个班级有一个object类型的属性:

public object invoiceDetails { get; set; }

我将其设置为对象类型,因为它是JSON成功反序列化的唯一类型。 JSON对象中的实际属性是类型array([])或类型object({})。当它是object类型时,它由其他一些对象组成,可以使用List <>或Dictionary <>成功地反序列化。问题是我需要将该对象属性用作列表,并尝试将其强制转换为这样的列表:

(List<InvoiceDetails)entry.Value.invoiceDetails          

但是没有成功。我也尝试过将其转换为数组和字典,但再次失败。然后,我开始在互联网上寻找解决方案,找到了一些代码,最后我的代码是:

if ((entry.Value.invoiceDetails != null) && ((IList)entry.Value.invoiceDetails).Count > 0)
{
  IList objList = (IList)entry.Value.invoiceDetails;
  IEnumerable<InvoiceDetails> list = objList.Cast<InvoiceDetails>();
  //List<InvoiceDetails> listToIterate = list.ToList();
  foreach (var item in list)
  {
    if (item.invoice_ref != null)
    {
      UpdateEntry("tbl_ts_InvoiceDetails", "invoice_ref", item.invoice_ref, item.id);
    }

    if (item.bill_note != null)
    {
      UpdateEntry("tbl_ts_InvoiceDetails", "bill_note", item.bill_note, item.id);
    }
  }
}

我已经成功地将“ invoiceDetails”强制转换为IList,但是当我输入foreach时,会抛出错误:

  

“无法将类型为'Newtonsoft.Json.Linq.JProperty'的对象转换为类型为'TicketSystemDataTransferService.Models.InvoiceDetails'。”

当我尝试执行注释的代码(... = list.ToList())时,我收到相同的错误消息。

您能给我一个建议,如何将invoiceDetails投射到c#列表中,以便使用吗?

1 个答案:

答案 0 :(得分:0)

这是使用Newtonsoft的方法:

class Program
{
    static void Main(string[] args)
    {
        Item item = new Item { Name = "Test Item" }; //Create an Item entity
        string jsonItem = Newtonsoft.Json.JsonConvert.SerializeObject(item); //Convert given Item to json
        Item lastItem = Newtonsoft.Json.JsonConvert.DeserializeObject<Item>(jsonItem); //Convert given json in Item

        List<Item> items = new List<Item>()
        {
            new Item { Name ="Test Item 1" },
            new Item { Name ="Test Item 2" },
            new Item { Name ="Test Item 3" },
            new Item { Name ="Test Item 4" },
            new Item { Name ="Test Item 5" }
        }; //Create a list of Item
        string jsonListItems = Newtonsoft.Json.JsonConvert.SerializeObject(items); //Convert given list of Item to json
        List<Item> lastListItems = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Item>>(jsonListItems); //Convert given json in list of Item
    }

}

public class Item
{
    public string Name { get; set; }
}