C#实现JSON加载更新并转XML文件的技术问题求助
解决方案:实现JSON加载更新并转换为XML
问题分析
- Boxers1.json是JSON数组,可直接反序列化为
List<Boxer>进行字段更新,但直接用JsonConvert.DeserializeXNode转换XML会失败——因为XML要求必须有唯一根节点,而JSON数组没有对应的根结构。 - Boxers2.json是带根节点的JSON对象,能直接转换为XML,但缺少对应的实体类,无法直接反序列化为强类型对象进行字段更新。
方案一:基于Boxers1的数组结构,更新后包装为合法XML根节点
保留现有Boxer类,更新后先将对象序列化为JSON数组,再手动包装成带根节点的JSON对象,最后转换为XML。
完整代码示例
static void Main(string[] args) { ProcessBoxers1AndConvertToXml(); } static void ProcessBoxers1AndConvertToXml() { // 1. 加载并更新Boxers1.json string fileName1 = @"C:\Users\Natan\source\repos\JsonToXml\JsonToXml\Boxers1.json"; string jsonFile1 = File.ReadAllText(fileName1); var boxers = JsonConvert.DeserializeObject<List<Boxer>>(jsonFile1); // 执行更新操作 boxers[0].name = "Evander"; boxers[0].weight = 112; boxers[0].height = 188; boxers[0].teamName = "teamEvander"; // 2. 将更新后的对象序列化为JSON数组 string updatedJsonArray = JsonConvert.SerializeObject(boxers, Formatting.Indented); // 3. 包装为带根节点的JSON对象(对应XML的根节点) string wrappedJson = $"{{\"Boxers\": {{\"Boxer\": {updatedJsonArray}}}}}"; // 4. 转换为XML并保存 XNode xmlNode = JsonConvert.DeserializeXNode(wrappedJson, "Boxers"); File.WriteAllText(@"C:\Users\Natan\source\repos\JsonToXml\JsonToXml\UpdatedBoxers.xml", xmlNode.ToString()); }
方案二:定义对应Boxers2结构的实体类,强类型处理全流程
通过新增对应Boxers2结构的实体类,实现直接反序列化、更新、转换XML的全流程强类型操作,更规范且不易出错。
步骤1:新增实体类
[Serializable] public class BoxersRoot { public BoxerList Boxers { get; set; } } [Serializable] public class BoxerList { public List<Boxer> Boxer { get; set; } } // 保留原有的Boxer类 [Serializable] public class Boxer { public string name { get; set; } public double weight { get; set; } public double height { get; set; } public string teamName { get; set; } }
步骤2:完整处理代码
static void Main(string[] args) { ProcessBoxers2WithStrongTypes(); } static void ProcessBoxers2WithStrongTypes() { // 1. 加载Boxers2.json并反序列化为强类型对象 string fileName2 = @"..\Boxers2.json"; string jsonFile2 = File.ReadAllText(fileName2); var boxersRoot = JsonConvert.DeserializeObject<BoxersRoot>(jsonFile2); // 2. 执行更新操作 if (boxersRoot?.Boxers?.Boxer != null && boxersRoot.Boxers.Boxer.Count > 0) { boxersRoot.Boxers.Boxer[0].name = "Evander"; boxersRoot.Boxers.Boxer[0].weight = 112; boxersRoot.Boxers.Boxer[0].height = 188; boxersRoot.Boxers.Boxer[0].teamName = "teamEvander"; } // 3. 将更新后的对象序列化为JSON,再转换为XML string updatedJson = JsonConvert.SerializeObject(boxersRoot, Formatting.Indented); XNode xmlNode = JsonConvert.DeserializeXNode(updatedJson, "Boxers"); File.WriteAllText(@"C:\Users\Natan\source\repos\JsonToXml\JsonToXml\UpdatedBoxers.xml", xmlNode.ToString()); }
关键说明
- 两种方案都能实现加载更新JSON+转换XML的需求,方案二更适合长期维护(强类型检查),方案一适合快速适配现有数组结构。
- 使用
JsonConvert.DeserializeXNode时,第二个参数可以指定XML的根节点名称,确保生成的XML结构合法。
内容的提问来源于stack exchange,提问作者Nati Dim
相关产品推荐
相关产品推荐

