在源代码未格式化为集合时使用OPENJSON

在源代码未格式化为集合时使用OPENJSON,json,tsql,sql-server-2016,Json,Tsql,Sql Server 2016,我有一个非常大的源JSON文件,其中包含大量未格式化为集合的实体集合;每个实体之间没有封装的方括号和逗号分隔符。想象一下,我得到的不是“[{},{}]”,而是“{}{}”。我试图用OPENJSON查询它,但在当前结构中,我只得到第一条记录 以下是我正在做的: DECLARE @json VARCHAR(MAX) SET @json = N' { "Id":1 } { "Id":2 } ' SELECT * FROM

我有一个非常大的源JSON文件,其中包含大量未格式化为集合的实体集合;每个实体之间没有封装的方括号和逗号分隔符。想象一下,我得到的不是“[{},{}]”,而是“{}{}”。我试图用OPENJSON查询它,但在当前结构中,我只得到第一条记录

以下是我正在做的:

DECLARE @json VARCHAR(MAX)
SET @json =   
 N'  
    {  
    "Id":1
    } 
    {  
    "Id":2
    }  
'  

SELECT * FROM  
OPENJSON (@json)  
WITH (Id INT)

我得到一个结果,记录1。有没有一种方法可以查询当前的结构,或者我很乐意尝试重新格式化源代码?

根据Rob的建议,您需要进行一些预格式化

根据他的建议……如果“json”如您所述,这将起作用。我不希望它在大量文本中表现得那么好。如果您认为JSON比这更复杂,并且包含嵌套实体,我会跳过T-SQL,使用C#或PowerShell

DECLARE @json VARCHAR(MAX)
SET @json =   
 N'  
    {  
    "Id":1
    } 
    {  
    "Id":2
    }  
'  

SELECT * FROM  
OPENJSON (
    (SELECT '[' + STUFF(REPLACE(@json, '{', ',{'),  CHARINDEX('{', @json), 1, '') + ']')
    )
WITH (Id INT)

如果您可以在导入DB时以任何方式进行预格式化,那么总体而言,这可能是一种更好的方法

您的问题看起来与中讨论的问题类似,因此,可能同样的解决方案也适用于您的情况(我将反序列化您的“类似json的数据”使用此处描述的JSON.NET,然后直接使用它,或者再次序列化它,然后使用OPENJSON)

OPENJSON需要有效的JSON。您可以使用ISJSON函数检查该值是否有效


我们有一个类似的问题,就是在一个较大的字符串中嵌入了一个有效的JSON字符串,这意味着整个字符串都不是有效的JSON。我们必须找到并提取其中的有效JSON。因此,我们创建了一个计算列来执行此操作。然后,我们的JSON进程使用OPENJSON从计算列中提取有效的JSON。您只需权衡是否要持久化。

问题在于,这实际上不是JSON。很近,但不完全一样。我建议首先对它进行一些重新格式化,例如添加方括号,并将每个{替换为,{(然后使用STUFF删除第二个字符,其中有一个非法逗号。作为旁注,我认为
@json
应该是
NVARCHAR(MAX)
;)。