Using OPENJSON when the source is not formatted as a set

时间:2016-11-12 05:33:50

标签: json tsql sql-server-2016

I've got a very large source JSON file with a large collection of entities not formatted as a set; no encapsulating square bracket and no comma delimiter between each entity. So imagine that instead of '[{},{}]' I've got '{}{}'. I'm trying to query it with OPENJSON but in the current structure I only get the first record.

Here's what I'm effectively doing:

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

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

And I get a single result which is record 1. Is there a way of querying the structure as it stands or am I pretty much up for trying to reformat the source?

3 个答案:

答案 0 :(得分:2)

根据Rob的建议,你需要做一些预先格式化。

根据他的建议......如果“json”如你所描述的那样,这将有效。我不希望它在大量文本中表现良好。如果你是JSON比这更复杂并且包含嵌套实体我会跳过T-SQL并使用C#或PowerShell

let data = (message as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData!

            if let encryptedData = testCrypt(data, keyData:keyData, ivData:ivData, operation:UInt32(kCCEncrypt)) {
                let stringFromData = "\(encryptedData)"
                print("\(stringFromData)") // correct
    }

如果您可以在导入数据库时​​预先格式化,这可能是一个更好的方法

答案 1 :(得分:0)

您的问题看起来类似于this thread中讨论的问题,因此也许在您的情况下也可以应用相同的解决方案(我将反序列化您的" json类数据"使用JSON.NET如此描述然后直接使用它或再次序列化然后使用OPENJSON)

答案 2 :(得分:0)

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

我们有一个类似的问题,因为我们有一个有效的JSON字符串埋在一个更大的字符串中,这意味着整个字符串都是无效的JSON。我们必须在其中找到并提取有效的JSON。所以我们创建了一个计算列来完成这项工作。然后,我们的JSON进程使用OPENJSON从计算列中获取有效的JSON。你只需要权衡是否坚持。