将 XML 属性转换为 json

Posted

技术标签:

【中文标题】将 XML 属性转换为 json【英文标题】:convert XML attribute to json 【发布时间】:2021-10-26 12:50:30 【问题描述】:

作为一个简化示例,请考虑这个包含两个字段的表。一个是字符串,另一个是 XML。

SELECT TOP (1) [Source]
      , OrderParameter
  FROM [Rops].[dbo].[PreOrder]
Source="MediaConversions" OrderParameter=""

现在我想查询表并将结果作为json,但也将XML一次性转换为json。

SELECT TOP (1) [Source]
      , OrderParameter
  FROM [Rops].[dbo].[PreOrder]
for json path;

结果

["Source":"MediaConversions","OrderParameter":""]

但我希望将其转换为:

["Source":"MediaConversions","OrderParameter": "ParameterList":[ “x”:1,“y”:10] ]

如何添加“for json”来转换xml?

SELECT TOP (1) [Source]
      , select OrderParameter for json path????
  FROM [Rops].[dbo].[PreOrder]
for json path;

【问题讨论】:

OrderParameter 的输入数据是<?xml version="1.0" encoding="utf-16"?> 时,我不明白为什么您的“结果”可以包含<ParameterList ... 等。我在 MS SQL Server 中创建了一个临时表并运行了您的第二个查询(以for json path 结尾的那个),它给了我["Source":"MediaConversions","OrderParameter":"<?xml version=\"1.0\" encoding=\"utf-16\"?>"]。我不确定我是否看到了问题。 【参考方案1】:

您似乎想要提取 XML 中 ParameterList 节点的内部文本。为此,您可以使用 .value 和 XQuery:

SELECT TOP (1) [Source]
      , OrderParameter = (
           SELECT
              x = x.PL.value('(x/text())[1]','int'),
              y = x.PL.value('(y/text())[1]','int')
           FROM (VALUES( CAST(OrderParameter AS xml) )) v(OrderParameter)
           CROSS APPLY v.OrderParameter.nodes('ParameterList') x(PL)
           FOR JSON PATH, ROOT('ParameterList')
        )
  FROM [Rops].[dbo].[PreOrder]
FOR JSON PATH;

【讨论】:

看起来不错,但是 orderparameter 是 ntext 类型并且做一个 cast(orderparam as xml).nodes 无效 好的,你可以把它放在CROSS APPLY (VALUES中。请注意,ntext 已弃用,无论如何您都应该将 XML 存储在 xml 列中 这是一个 15 年历史的表,我试图通过将其放入 mongodb 来删除它,而不是更改架构。但是谢谢!学到了很多

以上是关于将 XML 属性转换为 json的主要内容,如果未能解决你的问题,请参考以下文章

将 XML 转换为 JSON 到 XML 时保留 json:Array 属性

将 JSON 转换为 XML

使用 JSON 将 XML 转换为 PHP 数组正在删除某些元素的属性

在转换为 XML 之前更改 JSON 对象中的属性名称

如何将 XML 属性转换为文本节点

JSON转换为Java中具有类型属性的XML