Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
反序列化嵌套Json C#_C#_Json_Nested - Fatal编程技术网

反序列化嵌套Json C#

反序列化嵌套Json C#,c#,json,nested,C#,Json,Nested,我试图从RESTAPI获取一个XML答案,并从中生成一个JSON字符串。然后将其反序列化,并将其用作C#中的强类型对象。到目前为止,我只取得了部分成功 API的答案是订单列表。看起来像这样,缩短了 <OrderList> <Order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" href="/__API__/order/1" order_id="1"> <OrderNo>1

我试图从RESTAPI获取一个XML答案,并从中生成一个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>
}

C#中的对象是这样创建的:

{
"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"
            }
        }
    ]
}
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; }
}
公共类根对象
{
公共医嘱列表医嘱列表{get;set;}
}
公共类订单列表
{
公共列表顺序{get;set;}
}
公共阶级秩序
{
公共字符串xmlnsxsi{get;set;}
公共字符串href{get;set;}
公共字符串顺序_id{get;set;}
公共字符串OrderNo{get;set;}
公共Erporderno Erporderno{get;set;}
公共客户客户{get;set;}
公共字符串状态{get;set;}
公共对象PaymentState{get;set;}
公共字符串PaymentIsCaptured{get;set;}
公共对象CaptureTime{get;set;}
公共字符串PaymentIsCancelled{get;set;}
公共对象取消时间{get;set;}
公共日期时间CreatedTime{get;set;}
公共日期时间更改时间{get;set;}
公共同步时间同步时间{get;set;}
}
公共类命令号
{
公共字符串xsinil{get;set;}
}
公共类客户
{
公共字符串href{get;set;}
公共字符串文本{get;set;}
}
公共类同步时间
{
公共字符串xsinil{get;set;}
}
到目前为止,我一直试图像这样反序列化它

XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlanswer);
string json = JsonConvert.SerializeXmlNode(doc);
var fromJson = JsonConvert.DeserializeObject<Rootobject>(json);
XmlDocument doc=新的XmlDocument();
doc.LoadXml(xmlanswer);
字符串json=JsonConvert.SerializeXmlNode(doc);
var fromJson=JsonConvert.DeserializeObject(json);
OrderList对象将填充300多个订单的列表。但在order对象内部,它停止工作。Customer对象未序列化,ErpOrderNr也未序列化。我不知道为什么。我读了很多帖子,但没有找到解决办法


有什么想法吗?

您可以使用JsonProperty属性来帮助反序列化程序,例如,它不知道“#text”应该转到text,因此您可以添加

[JsonProperty("#text")
public string Text {get;set;}

有几种方法可以将XML直接反序列化为C#对象。无需先将其转换为JSON。我建议调查一下。但基本上,看起来客户属性没有反序列化,因为JSON中的属性名称是
-href
#text
,而不是类中的
JSON
text
。您可以使用该属性指示要与C#属性关联的JSON属性名称。@JLRishe-谢谢。我已经研究了XML->C#对象,但是Json看起来更干净。至少从我所看到的来看。我按照你的建议做了,它解决了#文本字段的问题。但是-href仍然没有反序列化:(
xsi:nil=“true”
表示该值为null。因此
SyncedTime
CancelTime
属性的类型应该是
DateTime?
ErpOrderNo
可能应该是
int?
。它解决了文本字段的问题,但没有解决-href的问题。