c# – 如何在CLR过程中使用Json Parser?
作者:互联网
我正在疯狂地试图在我的类库中使用Json Serializer / Deserializer并在SQL Server中导入我的程序集.
我正在使用响应Json字符串的WebAPI,我想创建调用该API并使用api结果的CLR Sql过程.
我尝试了两种方法来反序列化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)
有没有办法在我的类库中解析json?
(除了在类库中为我自己创建一个Json Serializer / Deserializer !!!)
Visual Studio 2015社区,Microsoft Sql Server 2016开发人员
先感谢您.
解决方法:
不幸的是,没有任何方法既是.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之一.而且因为它是不支持,这意味着三件事:
>您需要将包含程序集的数据库设置为TRUSTWORTHY ON(由于需要PERMISSION_SET为UNSAFE),由于存在安全风险,通常会建议不要这样做.
>您无法确定底层代码是否正在执行可能导致“奇怪”行为的操作,例如在静态类变量中缓存值. SQLCLR对每个Assembly-owner数据库组合使用单个App Domain.因此,将在执行该代码的所有会话中共享该类.
>无法保证System.Runtime.Serialization.dll(或其两个依赖库中的任何一个:System.ServiceModel.Internals和SMDiagnostics)在将来的.NET Framework更新中不会更改为混合模式DLL. SQL Server中只允许使用纯MSIL库,因此如果其中任何一个更改为“混合”,那么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;
或者,您可以包含用于解析项目中的JSON的代码.你也有一些选择:
>虽然“首选”JSON解析器是Json.NET,但我无法将其作为SAFE程序集加载.我已经尝试了几年,但它有很多静态类变量用于缓存值(有助于性能,但不能在共享环境中工作),我似乎记得它依赖于某些不受支持的库(例如System.Runtime.Serialization).
>我使用JsonFx取得了一些成功.该代码还需要一些更新来处理静态类变量,但它是可能的.该项目可以处理从JSON转换为几个不同的标记.
>正如@ EvaldasBuinauskas的回答中提到的,您可以尝试LitJSON项目.我没有尝试过这个项目,所以我不确定它的工作情况.它似乎比JsonFX项目略小(不做其他格式),但截至目前它有25个未解决的问题,而JsonFX只有16个.
您应该查看两个项目的“问题”列表,以确保没有报告可能导致错误的内容.
标签:json,c,sql-server,serialization,sqlclr 来源: https://codeday.me/bug/20190611/1218022.html