SQL中采用Newtonsoft.Json处理json字符串-阿里云开发者社区

开发者社区> 杰克.陈> 正文

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

简介: 原文 SQL中采用Newtonsoft.Json处理json字符串 使用环境:       SQL Server2005;       VS2010;       关于SQL中部署CLR程序集的方法,网上一搜一大把,需要了解的自行查阅,呵呵。
+关注继续查看

原文 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啊?

       好吧,我做了最笨的办法,直接将Newtonsoft.Json的源码复制进我的项目里面,错误是一大堆一大堆,首先是.net版本 检测错误,后面直接使用.net3.5的方法(2005不支持4.0或以上的.net版本),把多余的全删了,后面发现竟然在这个项目中没有System.Runtime.Serialization中的全部类,比如EnumMemberAttribute就木有,好吧,我再把这个类的代码复制过来,ok,一一复制结束,编译,哈哈,没错了!开始部署吧。

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

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

  1. EXEC dbo.sp_changedbowner @loginame = N'sa', @map = true  
  2. GO  
  3. sp_configure 'clr enabled', 1  
  4. GO  
  5. RECONFIGURE  
  6. GO  
  7. ALTER DATABASE [stzpbbs] SET TRUSTWORTHY ON  
  8. GO  
  9. CREATE ASSEMBLY [System.Core]  
  10. AUTHORIZATION [dbo]  
  11. FROM   
  12. 'C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll'  
  13. WITH PERMISSION_SET = UNSAFE  
  14. GO  

      改成自己的数据库名称,执行,成功,点开数据库的程序集目录,果然有了,那就再部署、、、、、又提示在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字符串了,内容如下:

[csharp] view plaincopy
  1. using System;  
  2. using System.Data;  
  3. using System.Data.SqlClient;  
  4. using System.Data.SqlTypes;  
  5. using Microsoft.SqlServer.Server;  
  6. using Newtonsoft.Json;  
  7. using Newtonsoft.Json.Linq;  
  8. public partial class UserDefinedFunctions  
  9. {  
  10.     [Microsoft.SqlServer.Server.SqlFunction]  
  11.     public static SqlString Json(string json,string key)  
  12.     {  
  13.         // 在此处放置代码  
  14.         JObject ja = (JObject)JsonConvert.DeserializeObject(json);  
  15.         string re = ja[key].ToString();  
  16.         return new SqlString(re);  
  17.     }  
  18.     [Microsoft.SqlServer.Server.SqlFunction]  
  19.     public static SqlString JsonArray(string json,int s, string key)  
  20.     {  
  21.         // 在此处放置代码  
  22.         JArray ja = (JArray)JsonConvert.DeserializeObject(json);  
  23.         string re = ja[s][key].ToString();  
  24.         return new SqlString(re);  
  25.     }  
  26. };  


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

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

 

  1. 你好  
  2. 不好  


 

作者:kunoy

申明:作者写博是为了总结经验,和交流学习之用。
如需转载,请尽量保留此申明,并在文章页面明显位置给出原文连接。谢谢!

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
JS中比较2个字符串内元素的不同(字符1, 字符2, 分隔符可选)
比较2个字符串内元素的不同(字符1, 字符2, 分隔符可选) 文件: diff.js // 示例用法 /* var str1 = "tie, mao, 55"; var str2 = "tie, mao, csdn"; var result = diff(str1, str2, ','); ...
548 0
fastjson解析json字符串,key缺少双引号导致下游服务无法解析
背景说明 在使用fastjson 1.2.60版本将对象转化为json字符串时,为处理Map值为null的情况,采用了WRITE_MAP_NULL_FEATURES属性,但该属性解析出来的key中缺少双引号,在key包含特殊字符时,如“-”和“:",下游服务在进行反序列化时出现无法解析的错误,从而出现问题。
3036 0
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
8404 0
js处理url
需求:用js获得url的电话号码和状态 针对url地址:http://www.deikang.com/index.php?tel=15811296111&status=1&id=100 var url="http://www.
610 0
python3处理不标准json数据
keywords: python jsonsource: http://txw1958.cnblogs.com/ 先看下JSON的语法规则: JSON 语法规则JSON 语法是 JavaScript 对象表示法语法的子集。
863 0
Javascript中字符串直接量与new String的区别
通过String直接创建的字符串和字符串表面量为基本数据类型,属于JavaScript中的直接量(包含数字,以及数组、对象和正则表达式、数字和布尔值的直接量格式)。 通过 New String来实例化的是一个String对象, 所以我们可以调用String对象的方法。
185 0
+关注
杰克.陈
一个安静的程序猿~
10427
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载