将单个xml节点作为数组转换为json
Posted
技术标签:
【中文标题】将单个xml节点作为数组转换为json【英文标题】:Convert single xml node as array to json 【发布时间】:2021-09-05 06:11:51 【问题描述】:我的存储过程中有如下代码。我正在使用 Newtonsoft 库将此 xml 转换为 json。部门可能有一个或多个值。我想在将此 xml 转换为 json 时强制将其作为数组。我该怎么做。如何在 sql 存储过程中将 json:Array='true' 添加到我的部门节点中。以及我需要对我的 C# 代码进行哪些更改。
SELECT @xml = (
select p.fname,p.lname,
(
select dept.name, dept.address
from department dept inner join tbloffice off on off.officeid = dept.officeid
where off.officeid=p.officeid
FOR XML PATH('dept_detail'), TYPE
)
from person p
WHERE p.id = @ID
FOR XML PATH('person'), ROOT('export_person'), TYPE
)
RETURN @xml
对于多条记录:
<export_person>
<person>
<fname>James</fname>
<lname>Williams</lname>
<dept_details>
<name>Engineering</name>
<address>117, street</address>
</dept_details>
<dept_details>
<name>Science</name>
<address>119, street</address>
</dept_details>
</person>
</export_person>
对于单条记录:
<export_person>
<person>
<fname>James</fname>
<lname>Williams</lname>
<dept_details>
<name>Engineering</name>
<address>117, street</address>
</dept_details>
</person>
</export_person>
多部门记录形成为
"export_person":
"person":
"fname": "James",
"lname": "Williams",
"dept_details": [
"name": "Engineering",
"address": "117, street"
,
"name": "Science",
"address": "119, street"
]
我希望这个单一的部门记录也应该是这样的
"export_person":
"person":
"fname": "James",
"lname": "Williams",
"dept_details": [
"name": "Engineering",
"address": "117, street"
]
目前它正在形成
"export_person":
"person":
"fname": "James",
"lname": "Williams",
"dept_details":
"name": "Engineering",
"address": "117, street"
目前我正在使用以下 C# 代码来形成 json。我正在从丢弃 export_person 包装器的人员节点收集数据。
XmlDocument doc = new XmlDocument();
List<XElement> lstXelements = xmlExp.Elements().ToList();
List<dynamic> lstXelementJson = new List<dynamic>();
foreach (XElement Xele in lstXelements)
string nodeName = lstXelements[0].Name.LocalName.ToString();
doc.LoadXml(Xele.ToString());
var jsonData = JObject.Parse(JsonConvert.SerializeXmlNode(doc))[nodeName];
lstXelementJson.Add(jsonData);
【问题讨论】:
提问时,您需要提供minimal reproducible example: (1) DDL 和样本数据填充,即 CREATE 表和 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上面#1 中的样本数据。 (4) 你的 SQL Server 版本 (SELECT @@version;) 为什么不首先使用FOR JSON
将其创建为JSON?
我们的一个应用程序需要 xml,然后对于另一个函数我需要 json,所以我在存储过程中创建 XML
没有样本数据,以及@YitzhakKhabinsky 的预期结果you were asked to provide,我们无法帮助您 AA 我们无法运行您的 SQL 来获取您当前拥有的数据,我们也无法阅读您的想法以了解该数据应该是什么样子。
这不是您问题的直接答案。您可以使用 Linq 获取数据并使用 Newtonsoft 简单地转换为 JSON,而不是使用 FOR XML。恕我直言,这会简单得多。
【参考方案1】:
您是否尝试过直接从 SQL Server 生成 JSON?
declare @JSON nvarchar(max) = (
select
p.fname as 'export_person.person.fname',
p.lname as 'export_person.person.lname',
(
select
dept.name,
dept.address
from dbo.department dept
inner join dbo.office [off] on [off].officeid = dept.officeid
for json path
) as 'export_person.person.dept_details'
from person p
where p.id = @ID
for json path, without_array_wrapper
);
select @JSON as someColumnName;
【讨论】:
以上是关于将单个xml节点作为数组转换为json的主要内容,如果未能解决你的问题,请参考以下文章
xml转换为json格式时,如何将指定节点转换成数组 Json.NET
如何使用 XSLT 将单个子 xml 元素转换为 Json 数组
当 XML SOAP 响应中存在单个元素时,JSON 对象而不是数组