You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 06:31:03