2017-06-29 138 views
1

我有将JSON从一种模式转换为另一种模式的要求。将JSON转换为其他JSON

JSON来自C#应用程序,我不允许从那里修改。

从C#应用程序中,JSON存储到特定表的nvarchar字段中。

从C#来源的格式如下:

{ 
    "officeSummary" : { 
     "name" : "Test Office", 
     "geographicData" : [{ 
       "addressLine1" : "AddressLine 1", 
       "city" : "TestCity", 
       "stateProvince" : "NJ", 
       "postalCode" : "08543" 
      } 
     ],     
    } 
} 

我需要把它翻译成这样:

{ 
    "office" : { 
     "name" : "Test Office", 
     "officeAddress" : [{ 
       "streetAddress" : "AddressLine 1", 
       "city" : "TestCity", 
       "stateProvince" : "NJ", 
       "postalCode" : "08543" 
      } 
     ],     
    } 
} 

有什么办法,我们可以利用改变翻译这个键名SQL Server JSON功能?类似于JSON_VALUEJSON_MODIFY

+0

什么产生JSON模式/文件?它是一个存储过程吗? –

+0

它作为nvarchar存储在数据库表中。 –

+0

将JSON存储到数据库表中的是什么?基本上我试图找出我们要修改的地方。 –

回答

1

根据此Example - Rename a key,您可以使用3个步骤来重命名密钥。下面我提供了将'addressLine1'重命名为'streetAddress'的代码。虽然它变得有点混乱,但可以使用同样的方法替换剩余的值。注意,重命名的键移动到了最后,但这当然不会影响json解析应用程序。

DECLARE @json AS NVARCHAR(MAX); 
SET @json = '{ 
    "officeSummary" : { 
     "name" : "Test Office", 
     "geographicData" : [{ 
       "addressLine1" : "AddressLine 1", 
       "city" : "TestCity", 
       "stateProvince" : "NJ", 
       "postalCode" : "08543" 
      } 
     ]     
    } 
}' 

SELECT @json = 
JSON_MODIFY(
    JSON_MODIFY(@json, '$.officeSummary.geographicData[0].streetAddress' 
     , JSON_VALUE(@json, '$.officeSummary.geographicData[0].addressLine1') 
    ) 
, '$.officeSummary.geographicData[0].addressLine1', NULL) 

PRINT @json 

结果

{ 
    "officeSummary" : { 
     "name" : "Test Office", 
     "geographicData" : [{ 

       "city" : "TestCity", 
       "stateProvince" : "NJ", 
       "postalCode" : "08543" 
      ,"streetAddress":"AddressLine 1"} 
     ]     
    } 
} 
+0

您可能需要查看[示例 - 修改JSON对象](https://docs.microsoft.com/en-us/sql/t-sql/functions/json -modify-transact-sql#examples),使用'JSON_QUERY'来避免双重转义。 –

0

我想你可以使用来自Newtonsoft modify json .NET库的功能与SSIS脚本改造任务组合(假设你有SSIS可用)。

然后你可以将属性值读入一个变量。删除该属性并使用保存的值创建一个重命名的属性。