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?
答案 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。你只需要权衡是否坚持。