2017-10-04 10 views
1

私は作業中のDBにエスケープされていないキーを持つJSONをいくつか持っていますが、SQL Serverはそれを読み取れないようです。それを行う方法はありますか?SQL Server:エスケープされていないキーでJSONを読み取りますか?

例:

SELECT JSON_VALUE('{ site: "test" }', '$.site') 

それが次のエラーで、実行に失敗します:

SELECT JSON_VALUE('{ "site": "test" }', '$.site') 

が正しく、私はキーsiteを囲む引用符を削除すると、しかしtest

を出力

Msg 13609, Level 16, State 1, Line 1 
JSON text is not properly formatted. Unexpected character 's' is found at position 2. 

私はaccording to the specsを知っていますが、キーは引用符で囲まれている必要がありますが、他のパーサー(JSON.NETなど)はこのような文字列をデコードすることができます。

答えて

1

たぶん、前処理のいくつかの並べ替えあなたはまた、単にこのループをラップ、あなたのJSON内のすべてのキーを修正するための簡単な手順を書くことができ..

DECLARE @JSON VARCHAR(MAX) = '{ "pippo": "pippo", site: "test" }' 

DECLARE @PATH VARCHAR(255) = 'site' 

DECLARE @PATTERN VARCHAR(255) = '%[{ ,]' 

;WITH 
J AS (
    SELECT STUFF(@JSON, PATINDEX(@PATTERN + @PATH + ':%', @JSON) +1, LEN(@PATH), '"'[email protected]+'"') NEW_JSON, PATINDEX(@PATTERN + @PATH + ':%', @JSON) p 
) 
SELECT JSON_VALUE(NEW_JSON, '$.'[email protected]) PATH_VAL 
FROM J 

出力

PATH_VAL 
test 

を助けることができますファンクションまたはプロシージャは、更新すること

DECLARE @JSON VARCHAR(MAX) = '{ asite: "test", pippo: "site", site: "test" , "ciccio":"isgood" }' 
DECLARE @PATH VARCHAR(255) = '[a-zA-Z]%' 
DECLARE @PATTERN VARCHAR(255) = '%[{ ,]'  
DECLARE @P INT = 0, @L INT = 0 
DECLARE @W VARCHAR(255) = '' 

SET @P = PATINDEX(@PATTERN + @PATH + ':%', @JSON) 

while @P>0 BEGIN 

    SET @P = @P +1 
    SET @L = CHARINDEX(':', @json, @p) - @p 
    SET @W = SUBSTRING(@JSON, @P, @L) 
    SET @JSON = STUFF(@JSON, PATINDEX(@PATTERN + @W + ':%', @JSON) + 1, LEN(@W), '"' + @W + '"') 
    SET @P = PATINDEX(@PATTERN + @PATH + ':%', @JSON)  
    SELECT @P, @JSON 
END 

出力:

NEW_JSON 
{ "asite": "test", "pippo": "site", "site": "test" , "ciccio":"isgood" } 
+0

これは私が恐れていたものです...そして、私が避けたかったものは··· –

+1

私は知っていますが、入力が間違っています。もしJSON_VALUEを使いたいのであれば、それを良いものにする必要があります。上記のロジックを使用すると、値が必要なときにデータを修正する手続きを書くことができます。 – MtwStark

+0

入力全体が偽であるため、すべてのキーがエスケープされています(私の例は単純化して問題を表示しています) 。したがって、ソリューションは出発点ですが、私の問題は解決しません。デコード '{site: "test"、otherkey: "test2"}'は機能しません。私は入力を修正するためにすべての可能なキーの文字列置換を実行して終了しました.. –

関連する問題