如何在CLR程序中使用Json Parser?

时间:2017-02-11 12:08:05

标签: c# sql-server json serialization sqlclr

我正在疯狂地试图在我的类库中使用Json Serializer / Deserializer并在SQL Server中导入我的程序集。

我正在使用响应Json字符串的WebAPI,我想创建调用该API并使用api结果的CLR Sql过程。

我尝试了两种方法来反序列化Json字符串:

  

1)System.Web.Script.Serialization

     

2)System.Runtime.Serialization.Json

第一个给我这个错误:

  

汇编'system.web.extensions,版本= 4.0.0.0,culture = neutral,   公钥= 31bf3856ad364e35“。在SQL目录中找不到。   (Microsoft SQL Server,错误:6503)

第二个:

  

程序集'system.runtime.serialization,version = 4.0.0.0,   culture = neutral,publickeytoken = b77a5c561934e089。'没找到   SQL目录。 (Microsoft SQL Server,错误:6503)

Error ScreenShot

有没有办法在我的类库中解析json? (除了在类库中为我自己创建一个Json Serializer / Deserializer !!!)

Visual Studio 2015社区,Microsoft Sql Server 2016开发人员

先谢谢你。

3 个答案:

答案 0 :(得分:4)

不幸的是,没有任何方法都是.NET Framework的一部分(即内置) SAFE

如果你想要一个内置方法,那么你可以尝试使用{strong> System.Runtime.Serialization.Json 中的DataContractJsonSerializer类命名空间,反过来可以在 System.Runtime.Serialization.dll 中找到。您可以在此处找到使用它的示例:How to: Serialize and Deserialize JSON Data HOWEVER ,为了在SQL Server中使用它,您需要导入 System.Runtime.Serialization.dll ,因为它不是{{3}之一}。而且由于它不受支持,这意味着三件事:

  1. 您需要将包含程序集的数据库设置为TRUSTWORTHY ON(由于需要PERMISSION_SETUNSAFE),由于存在安全风险,通常会建议不要这样做
  2. 您无法确定基础代码是否正在执行可能导致" odd"行为,例如在静态类变量中缓存值。 SQLCLR对每个Assembly-owner + Database组合使用单个App Domain。因此,该类将在执行该代码的所有会话中共享。

  3. 您无法保证 System.Runtime.Serialization.dll (或其两个依赖库中的任何一个: System.ServiceModel.Internals SMDiagnostics )在未来的.NET Framework更新中无法更改为混合模式DLL。 SQL Server中只允许使用纯MSIL库,因此如果其中任何一个更改为#34;混合",那么SQL Server中的代码将开始失败并且无法修复它;你将不得不重新编码。以前发生过这样的事情: System.ServiceModel 与.NET 4.0的发布成为混合模式,所以使用它的代码在SQL Server 2005,2008和2008 R2中运行(都链接到CLR v 2.0和Framework版本2.0 - 3.5),但在SQL Server 2012中开始工作(全部链接到CLR v 4.0和Framework 4.0及更高版本)。

  4. 但是,如果你想尝试一下,请执行以下操作(它会自动加载2个相关的DLL):

    USE [someDB];
    
    ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
    
    CREATE ASSEMBLY [System.Runtime.Serialization]
    FROM 'C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\System.Runtime.Serialization.dll'
    WITH PERMISSION_SET = UNSAFE;
    

    OR,您可以包含解析项目中JSON的代码。你也有一些选择:

    1. 虽然"首选" JSON解析器是Json.NET,我无法将其作为SAFE程序集加载。我已经尝试了几年,但它有很多静态类变量用于缓存值(有助于提高性能,但在共享环境中无法工作),我似乎记得它依赖它在一些不受支持的库上(例如 System.Runtime.Serialization )。

    2. 我使用Supported .NET Framework Libraries取得了一些成功。该代码还需要一些更新来处理静态类变量,但它是可能的。该项目可以处理从JSON转换为几个不同的标记。

    3. 正如@ EvaldasBuinauskas的答案所述,您可以尝试JsonFx项目。我没有尝试过这个项目,所以我不确定它的工作情况。它似乎比JsonFX项目小一点(不做其他格式),但截至目前它有25个未解决的问题,而JsonFX只有16个。

      您应该查看清单"问题"对于这两个项目,要确保没有报告可能导致错误的事情。

答案 1 :(得分:2)

我自己也有类似的问题,看看https://github.com/WCOMAB/SqlServerSlackAPI将LitJSON导入其项目的方式。

密钥文件:

你可以采取类似的方法。使用此方法,我不必将任何其他额外的CLR导入SQL Server实例。

值得一提的是,那个集会必须是不成功的。为了部署它,您将有两个选择:

答案 2 :(得分:2)

看看这个仓库https://github.com/geral2/SQL-APIConsumer

STEP 1

CREATE DATABASE TestDB; GO

STEP 2

USE TestDB GO sp_configure 'clr enabled',1 RECONFIGURE GO

第3步

ALTER DATABASE TESTDB SET TRUSTWORTHY ON GO

第4步

CREATE ASSEMBLY [System.Runtime.Serialization] AUTHORIZATION dbo FROM N'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Runtime.Serialization.dll' WITH PERMISSION_SET = UNSAFE--external_access GO

第5步

CREATE ASSEMBLY [Newtonsoft.Json] AUTHORIZATION dbo FROM N'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Newtonsoft.Json.dll' WITH PERMISSION_SET = UNSAFE go