包括' bit'从SQL到JSON的值

时间:2018-06-15 15:55:48

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

我有一个sproc工作流程如下:

  1. 表#ans(qid int,ans varchar(50),aid varchar(10))
  2. 表#temp1(cid int,[q1] bit)
  3. 表#final(XML_data varchar(max)
  4. Rextester:http://rextester.com/PUX22792

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

1 个答案:

答案 0 :(得分:1)

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

<h1>NAVIGATION BAR</h1> <div id="nav"> <ul> <li>HOME</li> <li>ABOUT</li> <li>CONTACT</li> </ul> </div>

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

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

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

结果如下:

enter image description here

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

--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;

而你需要在xsd以下进行正确的转换:

<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"
}