C#:XML反序列化后生成数组嵌套格式JSON的方法
解决XML反序列化与JSON二维数组序列化兼容问题
方案思路
保留原有的类结构以保证XmlSerializer能正确反序列化目标XML,同时通过自定义Newtonsoft.Json转换器,将DataRow对象直接序列化为字符串数组,从而让data字段输出为二维数组格式。
实现步骤
1. 保留原有类结构(保证XML反序列化正常)
原有的Table和DataRow类无需大幅修改,仅需为DataRow添加自定义转换器标记:
[XmlRoot("table")] public class Table { [XmlElement("name")] public string Name { get; set; } [XmlArray("headers"), XmlArrayItem("header")] public List<string> Headers { get; set; } = new List<string>(); [XmlArray("data"), XmlArrayItem("row")] public List<DataRow> Data { get; set; } = new List<DataRow>(); } // 为DataRow添加JSON转换器 [JsonConverter(typeof(DataRowConverter))] public class DataRow { [XmlElement("row_item")] public List<string> DataRowItems { get; set; } }
2. 实现自定义JSON转换器
创建DataRowConverter类,重写序列化逻辑,直接输出DataRowItems的数组:
public class DataRowConverter : JsonConverter<DataRow> { // 序列化:将DataRow直接转为字符串数组 public override void WriteJson(JsonWriter writer, DataRow value, JsonSerializer serializer) { serializer.Serialize(writer, value.DataRowItems); } // 反序列化(可选,若需从JSON转回对象则实现) public override DataRow ReadJson(JsonReader reader, Type objectType, DataRow existingValue, bool hasExistingValue, JsonSerializer serializer) { var items = serializer.Deserialize<List<string>>(reader); return new DataRow { DataRowItems = items }; } }
3. 执行JSON序列化
使用Newtonsoft.Json进行序列化时,转换器会自动生效:
// 假设已完成XML反序列化得到table对象 Table table = ...; // 序列化JSON string json = JsonConvert.SerializeObject(new { table = new[] { table } }, Formatting.Indented);
效果验证
序列化后的JSON将符合需求,data字段为二维数组格式:
{ "table": [ { "name": "Table 1", "headers": [ "Header 1", "Header 2" ], "data": [ [ "Item 1", "Item 2" ], [ "Item 3", "Item 4" ] ] } ] }
同时,原有的XML反序列化逻辑不受任何影响,依然能正确解析给定的XML结构。
内容的提问来源于stack exchange,提问作者Ryan Thomas
相关产品推荐
相关产品推荐

