我有以下场景:
class question {
idQuestion: string;
question: string;
type: string;
}
class options {
idOption: string;
option: string;
}
我的 SQL 返回:
idquestion question type idoption option
即:
question1 foo? textbox null null
question2 bar? select option1 aaa
question2 bar? select option2 bbb
question3 foobar? radio option1 aaa
question3 foobar? radio option2 bbb
question3 foobar? radio option3 ccc
我想将 SQL 响应映射到以下接口(interface):
questionOptions{
question: Question;
options: Option[];
}
我怎样才能让它成为可能?所以最后,我可以得到一个问题列表,每个问题都包含其选项。
P.S:从sql数据库中关联问题和选项会不会是更好的选择?
编辑:
我想从示例数据中获取以下 json:
[
{
idQuestion: "question1",
question: "foo?",
options: []
},
{
idQuestion: "question2",
question: "bar?"
options: [
{
idOption: "option1",
option: "aaa"
},
{
idOption: "option2",
option: "bbb"
},
]
}
]
最佳答案
我有一个辅助函数,它几乎可以将任何行/数据集转换为 JSON 字符串/数组。
假设 2012+
Declare @YourData table (idQuestion varchar(50),question varchar(50), type varchar(50),idOption varchar(50),[option] varchar(50))
Insert Into @YourData values
('question1','foo?','textbox', null, null),
('question2','bar?','select','option1','aaa'),
('question2','bar?','select','option2','bbb'),
('question3','foobar?','radio','option1','aaa'),
('question3','foobar?','radio','option2','bbb'),
('question3','foobar?','radio','option3','ccc')
Declare @JSON varchar(max) = ''
Select @JSON=@JSON+','+String
From (
Select String=Replace(B.JSON,'}',',"options":'+IsNull(C.JSON,'[]')+'}')
From (Select Distinct idquestion,question From @YourData) A
Cross Apply (Select JSON=[dbo].[udf-Str-JSON](0,0,(Select A.idQuestion,A.question for XML RAW))) B
Cross Apply (Select JSON=[dbo].[udf-Str-JSON](0,0,(Select idOption,[option] from @YourData Where idquestion=A.idquestion for XML RAW))) C
) A
Select '['+Stuff(@JSON,1,1,'')+']'
返回
UDF
CREATE FUNCTION [dbo].[udf-Str-JSON] (@IncludeHead int,@ToLowerCase int,@XML xml)
Returns varchar(max)
AS
Begin
Declare @Head varchar(max) = '',@JSON varchar(max) = ''
; with cteEAV as (Select RowNr =Row_Number() over (Order By (Select NULL))
,Entity = xRow.value('@*[1]','varchar(100)')
,Attribute = xAtt.value('local-name(.)','varchar(100)')
,Value = xAtt.value('.','varchar(max)')
From @XML.nodes('/row') As R(xRow)
Cross Apply R.xRow.nodes('./@*') As A(xAtt) )
,cteSum as (Select Records=count(Distinct Entity)
,Head = IIF(@IncludeHead=0,IIF(count(Distinct Entity)<=1,'[getResults]','[[getResults]]'),Concat('{"status":{"successful":"true","timestamp":"',Format(GetUTCDate(),'yyyy-MM-dd hh:mm:ss '),'GMT','","rows":"',count(Distinct Entity),'"},"retults":[[getResults]]}') )
From cteEAV)
,cteBld as (Select *
,NewRow=IIF(Lag(Entity,1) over (Partition By Entity Order By (Select NULL))=Entity,'',',{')
,EndRow=IIF(Lead(Entity,1) over (Partition By Entity Order By (Select NULL))=Entity,',','}')
,JSON=Concat('"',IIF(@ToLowerCase=1,Lower(Attribute),Attribute),'":','"',Value,'"')
From cteEAV )
Select @JSON = @JSON+NewRow+JSON+EndRow,@Head = Head From cteBld, cteSum
Return Replace(@Head,'[getResults]',Stuff(@JSON,1,1,''))
End
-- Parameter 1: @IncludeHead 1/0
-- Parameter 2: @ToLowerCase 1/0 (converts field name to lowercase
-- Parameter 3: (Select * From ... for XML RAW)
关于sql-server - 从 sql 查询制作 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40348360/