将单个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 对象而不是数组

将 JSON 数组转换为 XML

PHP将带有一些(重复)元素的XML转换为Json到Json数组[重复]

将数组转换为 XML 或 JSON