【问题标题】:Including 'bit' values from SQL to JSON包括从 SQL 到 JSON 的“位”值
【发布时间】:2018-11-25 12:08:05
【问题描述】:

我有一个存储过程工作流程如下:

  1. 表#ans(qid int, ans varchar(50),aid varchar(10))
  2. 表 #temp1(cid int,[q1] 位)
  3. 表#final(XML_data varchar(max)

Rextester:http://rextester.com/PUX22792

temp1 表有一个列 q1,它实际上是从 #ans 表和 varchar 列分组的。 q1 被声明为位,但它来自 varchar 列。因此,在最终的 XML 表中,我按原样选择此列 [q1],当我将 XML 输出转换为 JSON 时,我仍然可以看到该列是字符串而不是位。我创建了一个包含所有示例数据的 rextester 链接。任何帮助将不胜感激!

【问题讨论】:

  • 您使用的是什么 DBMS?您在此处标记了 mysqlsql-server。我已删除冲突标签,请更新它们并仅标记与您的问题相关的正确 DBMS。
  • 我正在使用 sql server 并将我的 xml 输出在线转换为 json

标签: sql json type-conversion bit xml-to-json


【解决方案1】:

我认为您的 SQL 的布局方式没有任何问题,这只是您用于 XML 到 JSON 的转换工具处理位数据类型的方式。除非您使用 XML 模式定义 (XSD),否则 XML 不会清楚地描述数据类型,而 JSON 是强类型的,其中可以清楚地指定数字、布尔值、字符串、空字符串、空对象和空值。因此,如果您查看下面的 xml 元素,它可以是或:

<StringOrNumber>12345</StringOrNumber> <StringOrBoolean>false</StringOrBoolean>

因此,默认的 XML 到 JSON 转换将所有内容都视为字符串,因此您将位 0/1 视为字符串表示“0”和“1”。在您的中间件应用程序代码中,您必须使用带有 xml 和 xsd 作为输入的转换库才能获得正确的 JSON 结果。

我对您的 SQL 进行了更正以使其可执行:

--Table 1 to store all answers
create Table #ans(qid int, ans varchar(50), aid varchar(10));
insert into #ans values
       (1001,'test answer',null),
      (1002,null,'a'),
      (1003,null,'0'),
      (1004,null,'1');

--Table 2 to pivot answers
create table #temp(cid int,[1001] varchar(50),[1002] varchar(10), [1003] bit, [1004] bit);
insert into #temp
select 12345,
        max(case when qid = '1001' then a.ans end) as [1001],
         max(case when qid = '1002' then a.aid end) as [1002],
          max(case when qid = '1003' then a.aid end) as [1003],
           max(case when qid = '1004' then a.aid end) as [1004]
from #ans a;

--Doing an XML final select
create table #final (xml_data varchar(max));
insert into #final
select 
final_data = 
      (select
        fakedata = 'something..',
        question1 = t.[1001],
        question2 = t.[1001],
        question3 = t.[1003],
        question4 = t.[1004]
        from #temp t
      FOR XML PATH(''));

select * from  #ans;
select * from  #temp;
select * from  #final;

结果如下:

因此,如果您将这个online transformer 用于 xml 到 json 转换器(当然它不需要 xsd 进行转换)。它会将您的 xml 数据转换为 json,如下所示:

<root>
<fakedata>something..</fakedata><question1>test answer</question1><question2>test answer</question2><question3>0</question3><question4>1</question4>
</root>


{
   "fakedata": "something..",
   "question1": "test answer",
   "question2": "a",
   "question3": "1",
   "question4": "0"
}

而您需要在 xsd 下方进行正确的转换:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element type="xs:string" name="fakedata"/>
        <xs:element type="xs:string" name="question1"/>
        <xs:element type="xs:string" name="question2"/>
        <xs:element type="xs:boolean" name="question3"/>
        <xs:element type="xs:boolean" name="question4"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

{
   "fakedata": "something..",
   "question1": "test answer",
   "question2": "a",
   "question3": true,
   "question4": false
}

【讨论】:

  • 知道了。我暂时使用在线转换器,因为我的一个队友正在制作一个将我的 XML 转换为 JSON 的工具。那么我可以认为这是对该转换器工具的更改吗?
  • 是的 xsd 是正确解析 xml 所必需的。我不确定你的中间件应用堆栈是什么,但如果你的团队使用的是 JAVA,你总是可以使用 JAXB 进行 XML 到 POJO 的转换,然后再使用 Jackson 来转换到 POJO。
  • 它是一个将 XML 转换为 JSON 的 .Net 工具
  • Okies,我接触 .Net 已经有一段时间了,但我很确定它确实有库可以完成这项工作。另一种选择是编写 XSLT 来直接进行 XML 到 JSON 的转换。如果您的团队需要帮助,请让他们发布问题,他们会得到帮助。
猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2020-03-25
  • 1970-01-01
  • 2016-03-16
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多