【问题标题】:adding empty array to JSON while serializing from XML in C#在 C# 中从 XML 序列化时将空数组添加到 JSON
【发布时间】:2018-08-02 12:42:54
【问题描述】:

我正在开发一个解析 XML 文档并将其序列化的应用程序。我能够解析并转换为 JSON 但问题。 如果 XML 中不存在该元素节点,我想要实现的是在 json 中添加一个空数组结构。但从我的代码来看,输出为element : null

到目前为止我做了什么 -

我的班级:

    [Serializable()]
    [XmlRoot("CarCollection")]
    public class CarCollection
    {
        [XmlArray("Cars")]
        [XmlArrayItem("Car", typeof(Car))]
        public Car[] Car { get; set; }
    }

    [Serializable()]
    public class Car
    {
        [XmlElement("StockNumber")]
        public string stockNumber { get; set; }

        [XmlElement("Make")]
        public string make { get; set; }

        [XmlArray("Models")]
        [XmlArrayItem("model", typeof(Model))]
        public Model[] Model { get; set; }

    }

    [Serializable()]
    public class Model
    {
        [XmlElement("modelName")]
        public string modelName { get; set; }

        [XmlElement("modelType")]
        public string modelType { get; set; }

        [XmlElement("price")]
        public string price { get; set; }

        [XmlElement("preOrderNeeded")]
        public string preOrderNeeded { get; set; }
    }
}

XML:

<?xml version="1.0" encoding="utf-8"?>
<CarCollection>
<Cars>
  <Car>
    <StockNumber>1020</StockNumber>
    <Make>Renault</Make>
    <Models>
       <model>
          <modelName>Kwid</modelName>
          <modelType>Basic</modelType>
          <price>5 Lakhs</price>
          <preOrderNeeded>No</preOrderNeeded>
       </model>
       <model>
          <modelName>Kwid</modelName>
          <modelType>Compact Model with all upgrades</modelType>
          <price>7.25 Lakhs</price>
          <preOrderNeeded>Yes</preOrderNeeded>
       </model>
    </Models>
  </Car>
  <Car>
    <StockNumber>1010</StockNumber>
    <Make>Toyota</Make>

  </Car>
</Cars>
</CarCollection>

我的序列化逻辑:

CarCollection cars = null;

XmlSerializer serializer = new XmlSerializer(typeof(CarCollection));
using (StreamReader sr = new StreamReader(@"C:\Users\someNAme\Downloads\XML\modelXML.xml"))
{
    cars = (CarCollection)serializer.Deserialize(sr);

    string output = JsonConvert.SerializeObject(cars);
}

这就是我得到的:

{
    "stockNumber": "1010",
    "make": "Toyota",
    "Model": null
}

我想实现:

{
    "stockNumber": "1010",
    "make": "Toyota",
    "Model": []
}

【问题讨论】:

  • 您可以只添加额外的逻辑行,如果属性为空,则实例化一个新的空数组...或者您可以忽略它,如:stackoverflow.com/questions/6507889/…
  • 其实这个项目只是一个示例。我正在做的事情有点复杂。 XML 节点也是如此。因此,您的建议可能适用于直接 XML。但我也试过这个,它不工作。我期待类似 - "Models": [ { "childElements": { "childElement": [{ }] 其​​中 childElement 是模型类中的另一个列表
  • 那么最终目标是什么,您宁愿提供一个空对象而不是为整个架构提供null?
  • 如果您想查看完整的结构,您也可以只实例化内部数组。不过,Hozikimaru 根据您的示例回答了这个问题,因此最好在您的问题中准确说明您想要的结构。

标签: c# json xml serialization


【解决方案1】:

您可以尝试Cinchoo ETL - 一个开源库,进行xml -> json转换,如下所示

using (var r = new ChoXmlReader("Sample49.xml")
    .WithXPath("/CarCollection/Cars/Car")
    )
{
    Console.WriteLine(ChoJSONWriter.ToTextAll(r));
}

输出:

[
 {
  "StockNumber": 1020,
  "Make": "Renault",
  "Models": [
   {
     "modelName": "Kwid",
     "modelType": "Basic",
     "price": "5 Lakhs",
     "preOrderNeeded": "No"
   }
   {
     "modelName": "Kwid",
     "modelType": "Compact Model with all upgrades",
     "price": "7.25 Lakhs",
     "preOrderNeeded": "Yes"
   }
  ]
 },
 {
  "StockNumber": 1010,
  "Make": "Toyota",
  "Models": []
 }
]

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    相关资源
    最近更新 更多