SQL2008使用json.net实现XML与JSON互转
借助CLR,首先实现字符串的互转,然后使用存储过程实现JSON2table
- public
class JsonFunction - {
- /// <summary>
- /// XML转JSON
- /// </summary>
- /// <param name="xml"></param>
- /// <returns></returns>
- /// <remarks>
- /// json不建议太长
- /// </remarks>
- [Microsoft.SqlServer.Server.SqlFunction(Name = "Xml2Json")]
- public
static SqlString Xml2Json(SqlXml xml) - {
- System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
- doc.LoadXml(xml.Value);
- string json = JsonConvert.SerializeXmlNode(doc, Formatting.Indented);
- doc.Clone();
- return
new SqlString(json); - }
- [Microsoft.SqlServer.Server.SqlFunction(Name = "Json2Xml")]
- public
static SqlXml Json2Xml(string json) - {
- System.Xml.XmlDocument doc = JsonConvert.DeserializeXmlNode(json);
- System.IO.StringWriter sw = new System.IO.StringWriter();
- doc.WriteTo(new System.Xml.XmlTextWriter(sw));
- return
new SqlXml(new System.Xml.XmlTextReader(new System.IO.StringReader(sw.ToString()))); - }
- [Microsoft.SqlServer.Server.SqlProcedure(Name = "Json2Table")]
- public
static
void Json2Table(string path, string json) - {
- System.Xml.XmlDocument doc = JsonConvert.DeserializeXmlNode(json);
- System.Xml.XmlNodeList list = null;
- if (!string.IsNullOrEmpty(path))
- list = doc.SelectNodes(path);
- else
- list = doc.ChildNodes;
- if (list == null || list.Count == 0)
- return;
- List<SqlMetaData> metas = new List<SqlMetaData>();
- string lastName = "";
- bool flag = false;
- for (int i = 0; i < list[0].ChildNodes.Count; i++)
- {
- if (lastName == list[0].ChildNodes[i].Name)
- {
- flag = true;
- break;
- }
- else
- lastName = list[0].ChildNodes[i].Name;
- metas.Add(new SqlMetaData(list[0].ChildNodes[i].Name, SqlDbType.NVarChar, SqlMetaData.Max));
- }
- var rec = new SqlDataRecord(metas.ToArray());
- SqlContext.Pipe.SendResultsStart(rec);
- foreach (System.Xml.XmlNode node in list)
- {
- if (flag)//行模式
- for (int i = 0; i < node.ChildNodes.Count; i++)
- {
- rec.SetString(0, node.ChildNodes[i].InnerXml);
- SqlContext.Pipe.SendResultsRow(rec);
- }
- else
- {
- for (int i = 0; i < metas.Count; i++)
- {
- rec.SetString(i, node.ChildNodes[i].InnerXml);
- }
- SqlContext.Pipe.SendResultsRow(rec);
- }
- }
- SqlContext.Pipe.SendResultsEnd();
- }
- //public static void Json2Table(string json)
- //{
- // //find first array
- // Q.Json.Linq.JObject jo = JsonConvert.DeserializeObject(json) as Q.Json.Linq.JObject;
- // Q.Json.Linq.JToken token = jo.First;
- // while (token != null && token.Type != Q.Json.Linq.JTokenType.Array)
- // {
- // token = token.First;
- // }
- // if (token == null)
- // return;
- // Q.Json.Linq.JArray array = token as Q.Json.Linq.JArray;
- // if (array.Count == 0)
- // return;
- // List<SqlMetaData> metas = new List<SqlMetaData>();
- // token = array[0].First;
- // while (token != null)
- // {
- // metas.Add(new SqlMetaData((token as Q.Json.Linq.JProperty).Name, SqlDbType.NVarChar, SqlMetaData.Max));
- // token = token.Next;
- // }
- // var rec = new SqlDataRecord(metas.ToArray());
- // SqlContext.Pipe.SendResultsStart(rec);
- // foreach (var item in array)
- // {
- // for (int i = 0; i < metas.Count; i++)
- // {
- // rec.SetString(i, item[metas[i].Name].ToString());
- // }
- // SqlContext.Pipe.SendResultsRow(rec);
- // }
- // SqlContext.Pipe.SendResultsEnd();
- //}
- }
测试语句
- VALUES ( 'A', '<ROOT><M>AAAA</M></ROOT>' )
- ,
- ( 'B', '<ROOT><D>00000</D></ROOT>' )
- , ( '' )
- SELECT *
- FROM test
- --DECLARE @X XML
- --SELECT @x = ( SELECT *
- -- FROM test
- -- FOR
- -- XML AUTO ,
- -- ELEMENTS ,
- -- ROOT
- -- )
- --SELECT @x
- --DECLARE @json NVARCHAR(MAX)
- --SELECT @json = dbo.xml2json(@x)
- --SELECT @json
- --SELECT dbo.Json2Xml(@json)
- FROM test
- XML AUTO ,
- ELEMENTS ,
- ROOT
- )) xml2json
- FROM test
- XML AUTO ,
- ELEMENTS ,
- ROOT
- ))) json2xml
- FROM test
- XML AUTO ,
- ELEMENTS ,
- ROOT
- ))
执行效果

参考
http://www.json4sql.com/examples.html
https://www.simple-talk.com/sql/t-sql-programming/consuming-json-strings-in-sql-server/
SQL2008使用json.net实现XML与JSON互转的更多相关文章
- org.json里实现XML和JSON之间对象互转
org.json包里有一个类org.json.XML可以实现XML和JSON之间的转换.http://www.json.org/javadoc/org/json/XML.html JSONObject ...
- 什么是json? 什么是xml?JSON与XML的区别比较
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成.它是基于 JavaScript Prog ...
- ASP.NET中的XML和JSON
一.DOM简介 1.XML 定义:XML是一种跨语言.跨平台的数据储存格式 2.什么是DOM DOM(document object model)文档对象模型:是一种允许程序或脚本动态的访问更新文档内 ...
- XML与JSON的对比
XML与JSON的对比 1.各自定义 XML 扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类 ...
- ASP.NET中XML转JSON的方法
原文:ASP.NET中XML转JSON的方法 许多应用程序都将数据存储为XML的格式,而且会将数据以JSON的格式发送到客户端以做进一步处理.要实现这一点,它们必须将XML格式转换为JSON格式. X ...
- xml转换为json格式时,如何将指定节点转换成数组 Json.NET
使用Json.NET转换xml成json时,如果xml只有单个节点,但json要求是数组形式[], JsonConvert.SerializeXmlNode 并不能自动识别 示例如下: RecordA ...
- java 中xml转换为json对象
1.前提须要jar包: json-lib-2.4-jdk15.jar 和 xom-1.2.5.jar ,maven 仓库: net.sf.json-lib json-lib 2.4 jdk15 xom ...
- JSON对象与XML相互转换工具类
依赖jar <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId ...
- UI:数据的解析XML与JSON
XML 和 JSON 语言 本篇博客来自互联网参考 XML 和 JSON 的互相转化 有属性的转化为对象,无属性的转化为字符串 节点的顺序性不可逆,XML有顺序,JSON 无顺序 XML 和 J ...
随机推荐
- Objective-C中把数组中字典中的数据转换成URL
可能上面的标题有些拗口,学过PHP的小伙伴们都知道,PHP中的数组的下标是允许我们自定义的,PHP中的数组确切的说就是键值对.而在OC我们要用字典(Dictionary)来存储,当然了Java用的是M ...
- @Async in Spring--转
原文地址:http://www.baeldung.com/spring-async 1. Overview In this article we’ll explore the asynchronous ...
- RAC某节点启动遭遇ORA-01105,ORA-01606
环境:RHEL6.5 + Oracle11.2.0.4 双节点RAC 故障现象:节点1实例没有启动成功,节点2正常启动. 1.故障现象 2.解决过程 3.总结 1.故障现象 尝试启动RAC 节点1,遭 ...
- Sql Server函数全解(四)日期和时间函数
日期和时间函数主要用来处理日期和时间值,本篇主要介绍各种日期和时间函数的功能和用法,一般的日期函数除了使用date类型的参数外,也可以使用datetime类型的参数,但会忽略这些值的时间部分.相同 ...
- ADO.net 更新和插入数据 遇到null 执行不成功
首先交代下背景,遇到一个问题:SqlCommand新增记录时,参数为null时,运行并不报错,只是返回(0),也就是更新失败. 在用C#往数据库里面插入记录的时候, 可能有的字段我们并不赋值(有可能是 ...
- 12款响应式 Lightbox(灯箱)效果插件
灯箱效果(Lightbox)是网站中最常用的效果之一,用于实现类似模态对话框的效果.网络上各种 Lightbox 插件琳琅满目,随着响应式设计(Respnsive Design)的发展,这一先进理念也 ...
- Mac OSX中的@executable_path, @load_path和@rpath的理解
本文转载自:https://wincent.com/wiki/@executable_path,_@load_path_and_@rpath.个人觉得写的很不错,简洁明了. Absolute path ...
- AngularJs $q promise
angularjs提供的$q服务是对Promises规范的一个实现.$q服务可以把一段异步的代码封装成同步的样式. 为啥是样式,因为异步还是异步,它并不会柱塞代码,只是看起来像同步代码. $q.whe ...
- jquery.uploadify上传文件配置详解(asp.net mvc)
页面源码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...
- 自定义MVC框架
我们在学习自定义MVC框架的时候常常会听到Model1 ,Model2和MVC.那么什么是Model1 什么是Model2什么又是MVC呢? 什么是Model1? Model1就是一种纯jsp开发技术 ...