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
相关产品推荐
相关产品推荐

