#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; }
}
}