Ошибка десериализации массива JSON в компоненте сценария SSIS

#c# #arrays #ssis #json-deserialization

#c# #массивы #ssis #json-десериализация

Вопрос:

Я пытаюсь десериализовать массив JSON с помощью компонента исходного сценария SSIS в C # с помощью Newtonsoft JSON.net , но я сталкиваюсь со следующей ошибкой, когда пытаюсь создать проект SSIS:

CS0029: не удается неявно преобразовать тип ‘System.Коллекции.Generic.ListЗаказать> чтобыПорядок’

Я подозреваю, что это как-то связано с тем, что класс Order не определен как список, но я довольно новичок в C #, и я действительно не знаю, поэтому был бы очень признателен за любой совет.

Это работало правильно для строки JSON до того, как я попытался изменить код для обработки массива, то есть в коде, который я изменил

 Order order = JsonConvert.DeserializeObject<Order>(record);
  

Для

 Order order = JsonConvert.DeserializeObject<List<Order>>(record);
  

Вот массив JSON — это просто типичный сценарий заказа / строки заказа, где один заказ может иметь несколько строк заказа.

 [
  {
    "OrderID": 291,
    "CustomerID": 1135,
    "OrderDate": "2020-07-21",
    "OrderLine": [
      {
        "OrderLineID": 1,
        "ProductID": 2,
        "Units": 1,
        "ClientID": 2
      },
      {
        "OrderLineID": 2,
        "ProductID": 8,
        "Units": 2,
        "ClientID": 1
      }
    ]
  },
  {
    "OrderID": 292,
    "CustomerID": 59,
    "OrderDate": "2020-07-21",
    "OrderLine": [
      {
        "OrderLineID": 1,
        "ProductID": 5,
        "Units": 1,
        "ClientID": 1
      },
      {
        "OrderLineID": 2,
        "ProductID": 7,
        "Units": 2,
        "ClientID": 2
      },
      {
        "OrderLineID": 3,
        "ProductID": 9,
        "Units": 1,
        "ClientID": 3
      }
    ]
  }
]
  

и вот C # из компонента сценария в SSIS:

 public override void CreateNewOutputRows()
{
    /*
      Add rows by calling the AddRow method on the member variable named "<Output Name>Buffer".
      For example, call MyOutputBuffer.AddRow() if your output was named "MyOutput".
    */

    string filePath = Connections.OrdersFile20200720.AcquireConnection(null).ToString();

    using (StreamReader fileContents = new StreamReader(filePath))
    {
        while (fileContents.Peek() >= 0)
        {
            string record = fileContents.ReadLine();
            //Order order = JsonConvert.DeserializeObject<Order>(record);
            Order order = JsonConvert.DeserializeObject<List<Order>>(record); //this is failing
            OrderOutputBuffer.AddRow();
            OrderOutputBuffer.OrderID = order.OrderID;
            OrderOutputBuffer.CustomerID = order.CustomerID;
            OrderOutputBuffer.OrderDate = order.OrderDate;

            foreach (OrderLine orderline in order.OrderLine)
            {
                OrderLineOutputBuffer.AddRow();
                OrderLineOutputBuffer.OrderID = order.OrderID;
                OrderLineOutputBuffer.OrderLineID = orderline.OrderLineID;
                OrderLineOutputBuffer.ProductID = orderline.ProductID;
                OrderLineOutputBuffer.Units = orderline.Units;
                OrderLineOutputBuffer.ClientID = orderline.ClientID;
            }

        }
    }
}

public class Order
{
    public int OrderID { get; set; }
    public int CustomerID { get; set; }
    public DateTime OrderDate { get; set; }
    public OrderLine[] OrderLine { get; set; }
}

public class OrderLine
{
    public int OrderLineID { get; set; }
    public int ProductID { get; set; }
    public int Units { get; set; }
    public int ClientID { get; set; }
}
  

}

Спасибо!

Ответ №1:

Я исправил это в конце:

     public override void CreateNewOutputRows()
{
    /*
      Add rows by calling the AddRow method on the member variable named "<Output Name>Buffer".
      For example, call MyOutputBuffer.AddRow() if your output was named "MyOutput".
    */

    string json = File.ReadAllText("Z:\DataTech Test\Data\Orders_20200720.json");
    var records = JsonConvert.DeserializeObject<List<Order>>(json);

    foreach (var r in records)

    {

        OrderOutputBuffer.AddRow();
        OrderOutputBuffer.OrderID = r.OrderID;
        OrderOutputBuffer.CustomerID = r.CustomerID;
        OrderOutputBuffer.OrderDate = r.OrderDate;

        foreach (OrderLine orderline in r.OrderLine)
        {
            OrderLineOutputBuffer.AddRow();
            OrderLineOutputBuffer.OrderID = r.OrderID;
            OrderLineOutputBuffer.OrderLineID = orderline.OrderLineID;
            OrderLineOutputBuffer.ProductID = orderline.ProductID;
            OrderLineOutputBuffer.Units = orderline.Units;
            OrderLineOutputBuffer.NurseryID = orderline.NurseryID;

        }

    }


}

public class OrderLine
{
    public int OrderLineID { get; set; }
    public int ProductID { get; set; }
    public int Units { get; set; }
    public int NurseryID { get; set; }
}

public class Order
{
    public int OrderID { get; set; }
    public int CustomerID { get; set; }
    public DateTime OrderDate { get; set; }
    public List<OrderLine> OrderLine { get; set; }
}

public class Root
{
    public List<Order> Order { get; set; }
}
  

}