2017-02-11 51 views
4

我越来越疯狂试图在我的类库中使用Json序列化器/反序列化器,并在SQL Server中导入我的程序集。如何在CLR过程中使用Json解析器?

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

我尝试2种方式来反序列化JSON字符串:

1) System.Web.Script.Serialization

2) System.Runtime.Serialization.Json

第一个让我这个错误:

Assembly 'system.web.extensions, version=4.0.0.0, culture=neutral, publickeytoken=31bf3856ad364e35.' was not found in the SQL catalog. (Microsoft SQL Server, Error: 6503)

和第二单:

Assembly 'system.runtime.serialization, version=4.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089.' was not found in the SQL catalog. (Microsoft SQL Server, Error: 6503)

Error ScreenShot

在我的类库中有没有解析json的方法?! (除了我的类库自我创造一个JSON串行器/解串器的!!!)

的Visual Studio 2015年社区的Microsoft SQL Server 2016开发者

预先感谢您。

回答

1

不幸的是,没有一种方法是.NET Framework的两个部分(即内置)SAFE

如果你想有一个内置的方法,那么你可能尝试使用DataContractJsonSerializer类,这是在System.Runtime.Serialization.Json命名空间,该消息又在System.Runtime被发现。 Serialization.dll。你可以在这里找到一个使用它的例子:How to: Serialize and Deserialize JSON Data但是,为了在SQL Server中使用此内存,您将需要导入System.Runtime.Serialization.dll,因为它不是Supported .NET Framework Libraries之一。因为它是不支持的,这意味着三两件事:

  1. 您需要包含大会将数据库设置为TRUSTWORTHY ON(由于需要的PERMISSION_SETUNSAFE),一些东西,一般建议不要因为它有安全风险。
  2. 您不能确定底层代码没有执行可能导致“奇怪”行为的事情,例如在静态类变量中缓存值。 SQLCLR为每个装配体所有者+数据库组合使用一个应用程序域。因此,该类将在执行该代码的所有会话中共享。

  3. 可以不能保证System.Runtime.Serialization.dll(或其两个相关库的:System.ServiceModel.InternalsSMDiagnostics)将不被改变为混合模式未来的.NET Framework更新中的DLL。在SQL Server中只允许使用纯粹的MSIL库,所以如果这3个中的任何一个改变为“混合”,那么你在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及更高版本)。

但是,如果你想尝试一下,请执行下列操作(它会自动加载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. 我已经使用JsonFx取得了一些成功。该代码还需要一些更新来处理静态类变量,但这是可能的。该项目可以处理从JSON转换为几个不同的标记。

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

    你应该看看列表“问题“对于这两个项目来说,确保没有报道会导致你的错误。

+2

您提供的代码很有用,非常感谢,但它有警告说:如果您升级或服务此程序集或.NET Framework,您的CLR集成例程可能会停止工作。你的建议是什么?包含解析项目中JSON的代码?或者继续导入System.Runtime.Serialization? – Parsa

+1

@Parsa是的,那个“警告”正是我在顶部第3点提到的(使用** ServiceModel **作为例子)。鉴于JSON就像XML一样只是一种文本格式,它只是解析它的问题(而不是需要仅在.NET Framework库中可用的资源)。这就是我使用JsonFX的原因。这不是完美的,但它做我需要的,大会标记为“安全”和数据库设置为“可信关闭”。但是如果你只需要一两个文档(不是一般意义上的),那么我会手工编写并完成它。 –

+2

我也使用JsonFx,而我想将JsonFx添加到sqlserver程序集中,它给了我这个错误:<<<由于安全程序集'JsonFx'中的类型'XmlInTransformer'具有静态字段'DefaultObjectName',因此CREATE ASSEMBLY失败。安全程序集中静态字段的属性必须在Visual C#中只读标记,在Visual Basic中只读标记,或者在Visual C++和中间语言中以initonly标记。 >>>之后,我去JsonFx源,并使该属性ReadOnly!它的工作原理是这样吗? – Parsa

2

我自己也有过类似的问题,请看https://github.com/WCOMAB/SqlServerSlackAPI引进LitJSON到其项目的方式。

关键文件:

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

值得一提的是,该程序集将不得不取消。为了部署它,你将有两种选择:

+2

我设置了我的数据库TRUSTWORTHY,它已经给我错误了。根据GartHub的链接,你可以想出解决这个问题的最终方法是为我自己创建Json解析器吗? (与正则表达式或拆分等) – Parsa

+1

您还可以将错误消息中提到的那些库导入到sql server。 –

+2

当我添加这个程序集时,它给了我这个错误: 程序集'system.servicemodel.internals,在SQL目录中找不到。 警告:您正在注册的Microsoft .NET Framework程序集“system.runtime.serialization”未在SQL Server托管环境中完全测试,因此不受支持。将来,如果您升级或服务此程序集或.NET Framework,您的CLR集成例程可能会停止工作。请参阅SQL Server联机丛书以获取更多详细信息。 (Microsoft SQL Server,错误:6503) – Parsa

相关问题