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

ASP.NET Core中XML转JSON后如何映射到自定义Grades类?

解决方案

你当前遇到的核心问题是JsonConvert.SerializeXmlNode转换XML得到的JSON会保留原始XML的层级、节点属性结构,和你定义的扁平化Grades类结构不匹配,无法直接反序列化,下面提供两种可直接落地的实现方案:


方案一:直接解析XML构造实例(更推荐)

跳过XML转JSON的中间步骤,直接读取XML节点赋值,性能更高、逻辑更简单:

using System.Xml.Linq;

// 加载XML字符串
XDocument xDoc = XDocument.Parse("你的原始XML内容");

// 提取grades节点下的所有属性节点
var gradePropertyNodes = xDoc.Descendants("KEY")
    .First(node => node.Attribute("name")?.Value == "grades")
    .Descendants("KEY")
    .ToList();

// 直接构造Grades实例
Grades mygrade = new Grades
{
    Courseid = gradePropertyNodes.First(p => p.Attribute("name")?.Value == "courseid").Element("VALUE")?.Value,
    Grade = gradePropertyNodes.First(p => p.Attribute("name")?.Value == "grade").Element("VALUE")?.Value,
    Rawgrade = gradePropertyNodes.First(p => p.Attribute("name")?.Value == "rawgrade").Element("VALUE")?.Value,
    // 特殊处理rank节点的null属性
    Rank = gradePropertyNodes.First(p => p.Attribute("name")?.Value == "rank").Element("VALUE")?.Attribute("null")?.Value ?? "null"
};

方案二:处理已转换的JSON字符串构造实例

如果你必须保留XML转JSON的步骤,可以用JObject解析现有JSON后手动提取映射:

using Newtonsoft.Json.Linq;

// 你已有的XML转JSON结果
string json = JsonConvert.SerializeXmlNode(doc);
// 解析JSON为JObject
JObject jObj = JObject.Parse(json);

// 提取成绩属性数组
JArray gradeProperties = (JArray)jObj["RESPONSE"]["SINGLE"]["KEY"][0]["MULTIPLE"]["SINGLE"]["KEY"];

// 转换为字典方便取值
var gradeDict = gradeProperties.ToDictionary(
    p => p["@name"].ToString(),
    p => 
    {
        var valueNode = p["VALUE"];
        // 处理rank的特殊结构
        if (valueNode is JObject)
        {
            return valueNode["@null"]?.ToString() ?? "null";
        }
        return valueNode?.ToString();
    });

// 赋值到Grades实例
Grades mygrade = new Grades
{
    Courseid = gradeDict.ContainsKey("courseid") ? gradeDict["courseid"] : null,
    Grade = gradeDict.ContainsKey("grade") ? gradeDict["grade"] : null,
    Rawgrade = gradeDict.ContainsKey("rawgrade") ? gradeDict["rawgrade"] : null,
    Rank = gradeDict.ContainsKey("rank") ? gradeDict["rank"] : null
};

内容的提问来源于stack exchange,提问作者Shuvo Barua

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:36:05