ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 如何在CLR过程中使用Json Parser?

2019-06-11 10:55:28  阅读:420  来源: 互联网

标签:json c sql-server serialization sqlclr


我正在疯狂地试图在我的类库中使用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)

Error ScreenShot

有没有办法在我的类库中解析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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有