C# 如何使用Newtonsoft或任何其他XML-to-JSON格式化程序将XML解析为以下格式的JSON

C# 如何使用Newtonsoft或任何其他XML-to-JSON格式化程序将XML解析为以下格式的JSON,c#,json,xml,asp.net-mvc,json.net,C#,Json,Xml,Asp.net Mvc,Json.net,我使用Newtonsoft将XML转换为JSON,其中一个API使用JSON作为输入,但使用Newtonsoft我得到了不同的JSON结果,这与API不兼容 <packages> <Package> <trackingNumber>23780498191986</trackingNumber> <shipCost>14</shipCost> <shipDate>2018-04-1

我使用Newtonsoft将XML转换为JSON,其中一个API使用JSON作为输入,但使用Newtonsoft我得到了不同的JSON结果,这与API不兼容

<packages>
  <Package>
     <trackingNumber>23780498191986</trackingNumber>
     <shipCost>14</shipCost>
     <shipDate>2018-04-12T15:33:39.887</shipDate>
     <items>
        <Item>
           <dscoItemId>sdsd</dscoItemId>
           <sku>sdsd</sku>
           <quantity>1</quantity>
           <lineNumber>1</lineNumber>
           <originalLineNumber>1</originalLineNumber>
           <originalOrderQuantity>1</originalOrderQuantity>
        </Item>
        <Item>
           <dscoItemId>CCCVSD33</dscoItemId>
           <sku>TESRRST123</sku>
           <quantity>2</quantity>
           <lineNumber>2</lineNumber>
           <originalLineNumber>2</originalLineNumber>
           <originalOrderQuantity>2</originalOrderQuantity>
        </Item>
     </items>
     <shipCarrier />
     <shipMethod />
     <shippingServiceLevelCode>FESDPO</shippingServiceLevelCode>
     <numberOfLineItems>2</numberOfLineItems>
     <shipFrom>
        <attention>OPERATIONS m</attention>
        <firstName>SD</firstName>
        <lastName>SD</lastName>
        <company></company>
        <address1>ADD1</address1>
        <address2 />
        <city>URBANCREST</city>
        <region>OH</region>
        <postal>43123</postal>
        <country>US</country>
        <phone>123.125.1265</phone>
        <email />
        <locationCode />
     </shipFrom>
     <shipTo>
        <attention>SD</attention>
        <firstName>DD</firstName>
        <lastName>DD</lastName>
        <company>ABC CORPORATION</company>
        <address1>123 FINE WAY</address1>
        <address2>BUILDING F-1</address2>
        <city>BALTIMORE</city>
        <region>MD</region>
        <postal>21234</postal>
        <country>US</country>
        <phone>222-222-2222</phone>
        <email>XYZ@ACOMP.COM</email>
        <locationCode />
     </shipTo>
     <shipWeight>35.00</shipWeight>
  </Package>
但使用Newtonsoft我得到以下结果,这对于我在一个测试应用程序中使用的API是无效的

"packages": {
"Package": {
  "trackingNumber": "780498193231986",
  "shipCost": "14.14",
  "shipDate": "2018-04-12T15:33:39.887",
  "items": {
    "Item": [
      {
        "dscoItemId": "AAVVCAACF",
        "sku": "ABC123",
        "quantity": "1",
        "lineNumber": "1",
        "originalLineNumber": "1",
        "originalOrderQuantity": "1"
      },
      {
        "dscoItemId": "CCCAAV33",
        "sku": "TEST123",
        "quantity": "2",
        "lineNumber": "2",
        "originalLineNumber": "2",
        "originalOrderQuantity": "2"
      }
    ]
  },
  "shipCarrier": null,
  "shipMethod": null,
  "shippingServiceLevelCode": "FEPO",
  "numberOfLineItems": "2",
  "shipFrom": {
    "attention": "OPERATIONS manager",
    "firstName": "asas",
    "lastName": "asas",
    "company": "asas",
    "address1": "Add1",
    "address2": null,
    "city": "URBANCREST",
    "region": "OH",
    "postal": "43123",
    "country": "US",
    "phone": "125.125.1235",
    "email": null,
    "locationCode": null
  },
  "shipTo": {
    "attention": "Attention: GROUP A",
    "firstName": "sa",
    "lastName": "sd",
    "company": "ABC CORPORATION",
    "address1": "123 FINE WAY",
    "address2": "BUILDING F-1",
    "city": "BALTIMORE",
    "region": "MD",
    "postal": "21234",
    "country": "US",
    "phone": "222-222-2222",
    "email": "JOE@ACOMP.COM",
    "locationCode": null
  }
下面是我用来将XML转换为JSON的代码

private static string XmlToJSONWithJSONNet(String xmlDoc)
{
    string jsonString = string.Empty;
    XmlDocument xd = new XmlDocument();
    xd.LoadXml(Convert.ToString(xmlDoc));
    jsonString = JsonConvert.SerializeXmlNode(xd,Newtonsoft.Json.Formatting.None, true);
    return jsonString;
}

我看不到不转换XML就可以做到这一点的方法。基本上,您需要将XML转换为以下格式

一种方法是将原始XML反序列化为模型A,将数据复制到模型B,然后将模型B序列化为JSON

模型类:

public class ModelA
{
    public List<Package> Packages { get; set; }
    ...
}

public class ModelB
{
    public List<Package> Packages { get; set; }
    ...
}
公共类ModelA
{
公共列表包{get;set;}
...
}
公共类模型B
{
公共列表包{get;set;}
...
}
目标XML:

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
   <packages>
      <trackingNumber>23780498191986</trackingNumber>
      <shipCost>14</shipCost>
      <shipDate>2018-04-12T15:33:39.887</shipDate>
      <items>
         <dscoItemId>sdsd</dscoItemId>
         <sku>sdsd</sku>
         <quantity>1</quantity>
         <lineNumber>1</lineNumber>
         <originalLineNumber>1</originalLineNumber>
         <originalOrderQuantity>1</originalOrderQuantity>
      </items>
      <items>
         <dscoItemId>CCCVSD33</dscoItemId>
         <sku>TESRRST123</sku>
         <quantity>2</quantity>
         <lineNumber>2</lineNumber>
         <originalLineNumber>2</originalLineNumber>
         <originalOrderQuantity>2</originalOrderQuantity>
      </items>
      <shipCarrier />
      <shipMethod />
      <shippingServiceLevelCode>FESDPO</shippingServiceLevelCode>
      <numberOfLineItems>2</numberOfLineItems>
      <shipFrom>
         <attention>OPERATIONS m</attention>
         <firstName>SD</firstName>
         <lastName>SD</lastName>
         <company />
         <address1>ADD1</address1>
         <address2 />
         <city>URBANCREST</city>
         <region>OH</region>
         <postal>43123</postal>
         <country>US</country>
         <phone>123.125.1265</phone>
         <email />
         <locationCode />
      </shipFrom>
      <shipTo>
         <attention>SD</attention>
         <firstName>DD</firstName>
         <lastName>DD</lastName>
         <company>ABC CORPORATION</company>
         <address1>123 FINE WAY</address1>
         <address2>BUILDING F-1</address2>
         <city>BALTIMORE</city>
         <region>MD</region>
         <postal>21234</postal>
         <country>US</country>
         <phone>222-222-2222</phone>
         <email>XYZ@ACOMP.COM</email>
         <locationCode />
      </shipTo>
      <shipWeight>35.00</shipWeight>
   </packages>
</manifest>

23780498191986
14
2018-04-12T15:33:39.887
sdsd
sdsd
1.
1.
1.
1.
CCCVSD33
TESRRST123
2.
2.
2.
2.
FESDPO
2.
操作m
SD
SD
地址1
城市休息
哦
43123
美国
123.125.1265
SD
DD
DD
ABC公司
123好办法
F-1大楼
巴尔的摩
医学博士
21234
美国
222-222-2222
XYZ@ACOMP.COM
35

您可以尝试使用解决方案,它位于python@acoto这不是很有帮助,是吗?这是一个专门用JSON标记的问题。NETYou已经介绍了大量的XML和JSON-您能否将其简化为一个只有几个属性的小得多的示例?这将使比较预期结果和实际结果更加容易。
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
   <packages>
      <trackingNumber>23780498191986</trackingNumber>
      <shipCost>14</shipCost>
      <shipDate>2018-04-12T15:33:39.887</shipDate>
      <items>
         <dscoItemId>sdsd</dscoItemId>
         <sku>sdsd</sku>
         <quantity>1</quantity>
         <lineNumber>1</lineNumber>
         <originalLineNumber>1</originalLineNumber>
         <originalOrderQuantity>1</originalOrderQuantity>
      </items>
      <items>
         <dscoItemId>CCCVSD33</dscoItemId>
         <sku>TESRRST123</sku>
         <quantity>2</quantity>
         <lineNumber>2</lineNumber>
         <originalLineNumber>2</originalLineNumber>
         <originalOrderQuantity>2</originalOrderQuantity>
      </items>
      <shipCarrier />
      <shipMethod />
      <shippingServiceLevelCode>FESDPO</shippingServiceLevelCode>
      <numberOfLineItems>2</numberOfLineItems>
      <shipFrom>
         <attention>OPERATIONS m</attention>
         <firstName>SD</firstName>
         <lastName>SD</lastName>
         <company />
         <address1>ADD1</address1>
         <address2 />
         <city>URBANCREST</city>
         <region>OH</region>
         <postal>43123</postal>
         <country>US</country>
         <phone>123.125.1265</phone>
         <email />
         <locationCode />
      </shipFrom>
      <shipTo>
         <attention>SD</attention>
         <firstName>DD</firstName>
         <lastName>DD</lastName>
         <company>ABC CORPORATION</company>
         <address1>123 FINE WAY</address1>
         <address2>BUILDING F-1</address2>
         <city>BALTIMORE</city>
         <region>MD</region>
         <postal>21234</postal>
         <country>US</country>
         <phone>222-222-2222</phone>
         <email>XYZ@ACOMP.COM</email>
         <locationCode />
      </shipTo>
      <shipWeight>35.00</shipWeight>
   </packages>
</manifest>