天天看点

SQL中采用Newtonsoft.Json处理json字符串

使用环境:

      SQL Server2005;

      VS2010;

      关于SQL中部署CLR程序集的方法,网上一搜一大把,需要了解的自行查阅,呵呵。

      SQL中处理字符串实在是太弱了,连数组都不能处理,就更别说json字符串了,好吧,它不能处理,我就给它加个处理程序集(还好2005已经加入了这个功能)。

      首先对于CLR我也不太懂,而且到现在我也没搞懂怎么把一个dll注册到SQL,俺是直接用VS2010新建一个sql sever的数据库项目,然后部署到SQL,能省多少操作就省多少操作。

       这里说一下CLR 数据库项目,第一次开发实在没搞懂引用竟然不能选择本地的Newtonsoft.Json.dll文件,而且好多c#类库也没有,这让我怎么使用Newtonsoft.Json啊?

       等待半天提示错误:在SQL目录中找不到程序集:system.core, version=3.5.0.0 这里我又晕了半天,如何把这个东东搞进SQL的目录呢?终于有位仁兄说:

       SQL SERVER并不支持System.Core.dll程序集,应先加载:

EXEC dbo.sp_changedbowner @loginame = N'sa', @map = true  

GO  

sp_configure 'clr enabled', 1  

RECONFIGURE  

ALTER DATABASE [stzpbbs] SET TRUSTWORTHY ON  

CREATE ASSEMBLY [System.Core]  

AUTHORIZATION [dbo]  

FROM   

'C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll'  

WITH PERMISSION_SET = UNSAFE  

      改成自己的数据库名称,执行,成功,点开数据库的程序集目录,果然有了,那就再部署、、、、、又提示在SQL目录中找不到程序集:System.Xml.Linq,那意思刚才的system.core已经引入正确了,到这里,我没有再继续下去了,既然system.core可以直接引入数据库,Newtonsoft.Json行不行呢?顺这个思路,总共需要引入的库有:

System.Core.dll

System.Xml.Linq.dll

SMdiagnostics.dll

System.Runtime.Serialization.dll

Newtonsoft.Json.dll

注意,PERMISSION_SET = UNSAFE  ,全部设置为unsafe。

       Newtonsoft.Json.dll添加成功后,再打开vs2010新建数据库项目,添加引用,在列表就能看到Newtonsoft.Json这个库 了,哈哈,点击引用,新建用户自定义函数,现在可以直接使用Newtonsoft.Json的方法反序列化json字符串了,内容如下:

using System;  

using System.Data;  

using System.Data.SqlClient;  

using System.Data.SqlTypes;  

using Microsoft.SqlServer.Server;  

using Newtonsoft.Json;  

using Newtonsoft.Json.Linq;  

public partial class UserDefinedFunctions  

{  

    [Microsoft.SqlServer.Server.SqlFunction]  

    public static SqlString Json(string json,string key)  

    {  

        // 在此处放置代码  

        JObject ja = (JObject)JsonConvert.DeserializeObject(json);  

        string re = ja[key].ToString();  

        return new SqlString(re);  

    }  

    public static SqlString JsonArray(string json,int s, string key)  

        JArray ja = (JArray)JsonConvert.DeserializeObject(json);  

        string re = ja[s][key].ToString();  

};  

       最后部署,数据库中调用方法:

print dbo.Json('{key:"001",value:"你好"}','value')  

print dbo.JsonArray('[{key:"001",value:"你好"},{key:"002",value:"不好"}]',1,'value')  

你好  

不好  

申明:作者写博是为了总结经验,和交流学习之用。

如需转载,请尽量保留此申明,并在文章页面明显位置给出原文连接。谢谢!