将完整JSON解析为SQL
我有以下JSON(仅用于显示目的的几个节点): 我不是特别擅长SQL,我一直在疯狂地重新学习我在uni的工作以及13年前的一份旧工作,以便完成一个项目,将护理管理解决方案API中的JSON数据导入我的Delphi应用程序,然后处理数据以解决这个和那个问题。JSON格式根据报告的不同而不同,对于CareNotesReport,上面的JSON就是生成的 我的Delphi应用程序逐字提取这个JSON并将其转储到一个.JSON文件中,其中包含一个ADO查询,然后执行以下代码(以及一些与此无关的其他select查询): 我有几个问题。在上面的代码中,我不得不从JSON文件中去掉第一个[and]以使其正常工作,但由于一些返回的大小,我不得不在Delphi中将memorystream的用法更改为filestream。这就产生了一个问题,尽管我可以修剪文件的最后一个]部分,但到目前为止,我还无法找到一种可靠(且简单)的方法来修剪第一个[。因此,我不得不得出结论,我的SQL代码是薄弱环节,它需要能够处理包含这两个字符的JSON 请有人告诉我哪里出了问题。我知道最初的JSON看起来是array,object,array,object,但我不知道从哪里开始。此外,我还伪造了读取幻灯片的能力,因为我知道该数组最多有5个对象,但如果可能的话,我更喜欢更动态的解决方案 无论是在Delphi中删除第一个JSON的方法,还是在处理原始JSON的更好的SQL方面,我们都将非常感激 问候将完整JSON解析为SQL,sql,json,delphi,Sql,Json,Delphi,我有以下JSON(仅用于显示目的的几个节点): 我不是特别擅长SQL,我一直在疯狂地重新学习我在uni的工作以及13年前的一份旧工作,以便完成一个项目,将护理管理解决方案API中的JSON数据导入我的Delphi应用程序,然后处理数据以解决这个和那个问题。JSON格式根据报告的不同而不同,对于CareNotesReport,上面的JSON就是生成的 我的Delphi应用程序逐字提取这个JSON并将其转储到一个.JSON文件中,其中包含一个ADO查询,然后执行以下代码(以及一些与此无关的其他sel
Ant您可以使用SQL Server功能解析此
JSON
输入。如果您的JSON
输入具有此固定格式(一个包含一项的数组和嵌套的JSON
数组),则需要使用OPENJSON()添加一个APPLY
运算符
调用解析嵌套的JSON
数组。请注意,当引用的属性包含内部JSON
对象或数组时,需要在列定义中使用AS JSON
选项
JSON:
声明:
SELECT
j1.DateDone,
j1.Note,
j2.IconID,
j2.CareNoteText
--INTO JSONCareNotes
FROM OPENJSON(@json, '$[0].CareNotes') WITH (
DateDone nvarchar(10) '$.DateDone',
Note nvarchar(255) '$.Note',
-- add additional columns definitons
SliderIcons nvarchar(max) AS JSON
) j1
CROSS APPLY OPENJSON(j1.SliderIcons) WITH (
IconID int '$.IconID',
CareNoteText nvarchar(100) '$.CareNoteText'
) j2
结果:
DateDone Note IconID CareNoteText
2019-09-30 Help with walking, used as four wheel walker, was content. 1093 was content
2019-09-30 Help with walking, used as four wheel walker, was content. 1156 used as four wheel walker
注释(JSON
basics):
- 当您想要解析
字符串并将结果作为表获取时,请使用表值函数,使用默认或显式模式JSON
- 函数从
字符串中提取对象或数组。如果值不是对象或数组,则在JSON
模式下结果为lax
,在NULL
模式下结果为错误strict
- 函数从
字符串中提取标量值。如果JSON
指向非标量值,则在路径
模式下结果为lax
,在NULL
模式下结果为错误strict
Delphi
和SQL Server
):
- 您可以将逻辑组织为一个存储过程,它有一个参数—JSON文本。在这种情况下,您将直接将
发送到SQL Server,而不需要使用JSON
(OPENROWSET()
需要其他参数)OPENJSON()
- 使用
执行存储过程是一项简单的任务,例如使用Delphi
ADO
[…]
建议它是一个数组值,其中可能包含多个元素。json解析器应该能够处理整个文档,但是根元素将是一个数组,您可以使用它的第一项获得与现在相同的效果。但是,奇怪的是,为什么您要用SQL而不是Delphi解析json,以及为什么要用SQL解析json太大了,内存流不够。你有1GB的Json字符串吗?不幸的是,问题中没有Delphi代码可以提供反馈。@GolezTrol从Json接收到的唯一元素是上面示例中提供的细节。这就是它的显示方式,可能只是一系列信息数组的一部分,但是API只允许访问CareNotes部分。在回答有关Delphi的问题时,我确实有Delphi代码,但最后我再次访问并决定需要第二个服务器风格的应用程序来处理所有计划的下拉列表并将其插入SQL,因此我认为最好的方法是通过SQL本身。我没有任何iss我一直在使用内存流,直到我开始在多个家庭中提取一个月的数据。尽管我会在每次数据流之后“释放”数据流,但我认为可能是整合使用推动了它的发展?正如我在OP中所说,我不是专业程序员,所以我正在尽我所能勉强完成。这太棒了,非常感谢你我会消化并努力学习!@Ant我很高兴这个答案有帮助。
DECLARE @json nvarchar(max)
--SELECT @json = BulkColumn
--FROM OPENROWSET (BULK 'C:\Users\User\Documents\Embarcadero\Studio\Projects\CMU\Win32\Debug\carenotesreport.json', SINGLE_CLOB) AS j
SELECT @json = N'[
{
"CareNotes":[
{
"CareNoteID":"34289e11-6433-4020-9734-224eb8caa11a",
"CareNoteExtendedID":"00000000-0000-0000-0000-000000000000",
"ADLName":"Mobility",
"FlagsText":"",
"Note":"Help with walking, used as four wheel walker, was content.",
"AnswerType":1,
"Fragment":"Help with walking",
"RemedialText":null,
"Details":null,
"ServiceUserID":"bc300962-3653-491a-9ba9-afab10964af4",
"ServiceUser":"Betty Test",
"ServiceUserLastName":"Test",
"ServiceUserForeNames":"Betty",
"ServiceUserDateofBirth":"19/03/1901",
"ServiceUserLocation":15,
"WorkerID":"53e6c7b9-2c80-451e-ba8c-abfb309380ac",
"Worker":"Beth Beth",
"VoidedByWorker":null,
"_supersedeStackID":null,
"SupersededByWorker":null,
"WorkerLastName":"Beth",
"DisplayOnShiftHandover":0,
"WorkerInitials":"B.B.",
"SliderData":"Walk",
"SliderData2":"Not entered",
"SliderIcons":[
{
"IconID":1093,
"CareNoteText":"was content"
},
{
"IconID":1156,
"CareNoteText":"used as four wheel walker"
}
],
"DateDone":"2019-09-30T21:24:41.994+00:00",
"DateDoneSU":"2019-09-30T21:24:41.994+00:00",
"Duration":"9 minutes",
"DurationInt":9,
"ActionIconID":6001,
"mraCareOrder":5000,
"wasPlanned":false,
"qrVerified":false,
"qrData":null,
"nfcVerified":null,
"inVerified":null,
"ViaMonitor":null
}
]
}
]'
SELECT
j1.DateDone,
j1.Note,
j2.IconID,
j2.CareNoteText
--INTO JSONCareNotes
FROM OPENJSON(@json, '$[0].CareNotes') WITH (
DateDone nvarchar(10) '$.DateDone',
Note nvarchar(255) '$.Note',
-- add additional columns definitons
SliderIcons nvarchar(max) AS JSON
) j1
CROSS APPLY OPENJSON(j1.SliderIcons) WITH (
IconID int '$.IconID',
CareNoteText nvarchar(100) '$.CareNoteText'
) j2
DateDone Note IconID CareNoteText
2019-09-30 Help with walking, used as four wheel walker, was content. 1093 was content
2019-09-30 Help with walking, used as four wheel walker, was content. 1156 used as four wheel walker