SQL中采用Newtonsoft.Json处理json字符串
原文 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程序集,应先加载:
- EXEC dbo.sp_changedbowner @loginame = N'sa', @map = true
- GO
- sp_configure 'clr enabled', 1
- GO
- RECONFIGURE
- GO
- ALTER DATABASE [stzpbbs] SET TRUSTWORTHY ON
- GO
- CREATE ASSEMBLY [System.Core]
- AUTHORIZATION [dbo]
- FROM
- 'C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll'
- WITH PERMISSION_SET = UNSAFE
- 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字符串了,内容如下:
- 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);
- }
- [Microsoft.SqlServer.Server.SqlFunction]
- public static SqlString JsonArray(string json,int s, string key)
- {
- // 在此处放置代码
- JArray ja = (JArray)JsonConvert.DeserializeObject(json);
- string re = ja[s][key].ToString();
- return new SqlString(re);
- }
- };
最后部署,数据库中调用方法:
- print dbo.Json('{key:"001",value:"你好"}','value')
- print dbo.JsonArray('[{key:"001",value:"你好"},{key:"002",value:"不好"}]',1,'value')
- 你好
- 不好
申明:作者写博是为了总结经验,和交流学习之用。
如需转载,请尽量保留此申明,并在文章页面明显位置给出原文连接。谢谢!
SQL中采用Newtonsoft.Json处理json字符串的更多相关文章
- SQL零星技术点:SQL中转换money类型数值转换为字符串问题
--SQL中转换money类型数值转换为字符串问题,直接转换就转为两位了,所以需要做一下处理.具体请看下述sql实例. 1 create table #test(price money) insert ...
- sql中的for xml path() 实现字符串拼接
通常我们需要在sql中拼接字符串 ,可以用for xml path() 来进行拼接,如下实例. 同时未去掉最后一个逗号可以用LEFT函数来实现. ) AS UserName FRO ...
- SQL中CONVERT()转化函数的用法 字符串转日期
SELECT CONVERT(varchar(), GETDATE(), ): :57AM SELECT CONVERT(varchar(), GETDATE(), ): // SELECT CONV ...
- SQL中得到最后一个“-”后面的字符串
declare @str varchar(50) set @str='-'+'1-9-3-2'--前面加个'-'防止没有'-'出错 select REVERSE(SUBSTRING(REVERSE(@ ...
- 使用 Newtonsoft.Json 操作 JSON 字符串
一.把实体类转化为 JSON 字符串 1. 为实体类赋值 SenderFromMQSearch senderFromMQSearch = new SenderFromMQSearch(); sende ...
- Newtonsoft.Json 操作 JSON 字符串
Newtonsoft.Json介绍 在做开发的时候,很多数据交换都是以json格式传输的.而使用Json的时候,我们很多时候会涉及到几个序列化对象的使用:DataContractJsonSeriali ...
- 基于 Vue.js 之 iView UI 框架非工程化实践记要 使用 Newtonsoft.Json 操作 JSON 字符串 基于.net core实现项目自动编译、并生成nuget包 webpack + vue 在dev和production模式下的小小区别 这样入门asp.net core 之 静态文件 这样入门asp.net core,如何
基于 Vue.js 之 iView UI 框架非工程化实践记要 像我们平日里做惯了 Java 或者 .NET 这种后端程序员,对于前端的认识还常常停留在 jQuery 时代,包括其插件在需要时就引 ...
- [转]C# JSON格式的字符串读取到类中
将JSON格式的字符串读取到类中 本例中建立JSON格式的字符串json,将其内容读取到Person类中 运行本代码需要添加引用动态库Newtonsoft.Json 程序代码: using Syste ...
- 在PHP代码中处理JSON 格式的字符串的两种方法:
总结: 在PHP代码中处理JSON 格式的字符串的两种方法: 方法一: $json= '[{"id":"1","name":"\u ...
随机推荐
- SSLSocket实现服务端和客户端双向认证的例子
首先创建服务器端私有密钥和公共密钥1, keytool -genkey -alias serverkey -keystore kserver.ks 密码: serverpass2, keytoo ...
- 转发年浩大神的spfa算法
http://www.cnblogs.com/superxuezhazha/p/5426624.html #include<iostream> #include<stdio.h> ...
- 交换机access和trunk的一些小结(转)
以太网端口有 3种链路类型:access.trunk.hybird Access类型端口只能属于1个VLAN 般用于连接计算机 端口: Trunk类型端口可以允许多个VLAN通过,可以接收和发送多个 ...
- [C#参考]利用Socket连续发送数据
这个例子只是一个简单的连续发送数据,接收数据的DEMO.因为最近做一个项目,要求robot连续的通过Socket传回自己的当前的位置坐标,然后客户端接收到坐标信息,在本地绘制地图,实时显示robot的 ...
- mysql 的not null 与 null的区别(转,恍然大悟)
相信很多用了mysql很久的人,对这两个字段属性的概念还不是很清楚,一般会有以下疑问: 1.我字段类型是not null,为什么我可以插入空值 2.为毛not null的效率比null高 3.判断字段 ...
- IOS-将长文字转化成图片方法
我们在看微博时,会看到一些长图片上的显示文章,现在就介绍下如何实现.分析下还是很简单的,总结如下:1.计算文字区域的高 2.利用UIGraphics图形上下文方法来实现 3.验证方法:UIImageW ...
- Anndroid 开发架构读书笔记
市面上大部分应用不外乎就是颠过来倒过去地做以下这些事情: --------------- --------------- --------------- --------------- | | | | ...
- which 查看可执行文件的位置
我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索: which 查看可执行文件的位置. whereis 查看文件的位置. ...
- ORA-31626:作业不存在 ORA-31633:无法创建主表"XXX.SYS_IMPORT_FULL_05"
错误代码: ORA-31626:作业不存在 ORA-31633:无法创建主表"XXX.SYS_IMPORT_FULL_05" ORA-06512:在"SYS.DBMS_S ...
- 一道Python练习题
有关字符串与编码的,转自廖雪峰Python教程. 小明的成绩从去年的72分提升到了今年的85分,请计算小明成绩提升的百分点,并用字符串格式化显示出'xx.x%',只保留小数点后1位: # -*- co ...