Десериализовать вложенные Json C# - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь взять XML ответ из API остальных и сделать из него строку JSON. И оттуда десериализуйте его и используйте как строго типизированный объект в C#. Пока я только частично успешен.

Ответ от API - список заказов. Похоже, это сокращенно.

<OrderList>
    <Order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" href="/__API__/order/1" order_id="1">
        <OrderNo>1</OrderNo>
        <ErpOrderNo xsi:nil="true" />
        <Customer href="/__API__/customer/42">1</Customer>
        <State>DENIED</State>
        <PaymentState>PAID</PaymentState>
        <PaymentIsCaptured>false</PaymentIsCaptured>
        <CaptureTime xsi:nil="true" />
        <PaymentIsCancelled>false</PaymentIsCancelled>
        <CancelTime xsi:nil="true" />
        <CreatedTime>2018-11-06T15:00:00Z</CreatedTime>
        <ChangedTime>2019-05-06T12:45:30Z</ChangedTime>
        <SyncedTime xsi:nil="true" />
    </Order>
    <Order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" href="/__API__/order/2" order_id="2">
        <OrderNo>2</OrderNo>
        <ErpOrderNo xsi:nil="true" />
        <Customer href="/__API__/customer/42">1</Customer>
        <State>DENIED</State>
        <PaymentState xsi:nil="true" />
        <PaymentIsCaptured>false</PaymentIsCaptured>
        <CaptureTime xsi:nil="true" />
        <PaymentIsCancelled>false</PaymentIsCancelled>
        <CancelTime xsi:nil="true" />
        <CreatedTime>2018-11-06T15:49:47Z</CreatedTime>
        <ChangedTime>2019-05-06T12:45:30Z</ChangedTime>
        <SyncedTime xsi:nil="true" />
    </Order>
</OrderList>

И JSON выглядит так:

{
"OrderList": {
    "Order": [{
            "-xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
            "-href": "/__API__/order/1",
            "-order_id": "1",
            "OrderNo": "1",
            "ErpOrderNo": {
                "-xsi:nil": "true"
            },
            "Customer": {
                "-href": "/__API__/customer/42",
                "#text": "1"
            },
            "State": "DENIED",
            "PaymentState": "PAID",
            "PaymentIsCaptured": "false",
            "CaptureTime": {
                "-xsi:nil": "true"
            },
            "PaymentIsCancelled": "false",
            "CancelTime": {
                "-xsi:nil": "true"
            },
            "CreatedTime": "2018-11-06T15:00:00Z",
            "ChangedTime": "2019-05-06T12:45:30Z",
            "SyncedTime": {
                "-xsi:nil": "true"
            }
        },
        {
            "-xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
            "-href": "/__API__/order/2",
            "-order_id": "2",
            "OrderNo": "2",
            "ErpOrderNo": {
                "-xsi:nil": "true"
            },
            "Customer": {
                "-href": "/__API__/customer/42",
                "#text": "1"
            },
            "State": "DENIED",
            "PaymentState": {
                "-xsi:nil": "true"
            },
            "PaymentIsCaptured": "false",
            "CaptureTime": {
                "-xsi:nil": "true"
            },
            "PaymentIsCancelled": "false",
            "CancelTime": {
                "-xsi:nil": "true"
            },
            "CreatedTime": "2018-11-06T15:49:47Z",
            "ChangedTime": "2019-05-06T12:45:30Z",
            "SyncedTime": {
                "-xsi:nil": "true"
            }
        }
    ]
}

}

Объект в C# был создан следующим образом:

public class Rootobject
{
    public Orderlist OrderList { get; set; }
}

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

public class Order
{
    public string xmlnsxsi { get; set; }
    public string href { get; set; }
    public string order_id { get; set; }
    public string OrderNo { get; set; }

    public Erporderno ErpOrderNo { get; set; }

    public Customer Customer { get; set; }
    public string State { get; set; }
    public object PaymentState { get; set; }
    public string PaymentIsCaptured { get; set; }
    public object CaptureTime { get; set; }
    public string PaymentIsCancelled { get; set; }
    public object CancelTime { get; set; }
    public DateTime CreatedTime { get; set; }
    public DateTime ChangedTime { get; set; }
    public Syncedtime SyncedTime { get; set; }
}

public class Erporderno
{
    public string xsinil { get; set; }
}

public class Customer
{
    public string href { get; set; }
    public string text { get; set; }
}

public class Syncedtime
{
    public string xsinil { get; set; }
}

До сих пор я пытался десериализовать это следующим образом.

XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlanswer);
string json = JsonConvert.SerializeXmlNode(doc);
var fromJson = JsonConvert.DeserializeObject<Rootobject>(json);

Объект OrderList заполняется списком из 300+ заказов. Но внутри объекта заказа он перестает работать. Объект Customer не сериализуется, как и ErpOrderNr. И я не могу понять, почему. Я прочитал много сообщений, но не нашел решения.

Есть идеи?

1 Ответ

1 голос
/ 22 апреля 2020

вы можете использовать атрибут JsonProperty, чтобы помочь десериализатору, например, он не знает, что "#text" должен go к тексту, поэтому вы можете добавить

[JsonProperty("#text")
public string Text {get;set;}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...