SQL2008使用json.net实现XML与JSON互转

时间:2023-03-08 19:12:35

借助CLR,首先实现字符串的互转,然后使用存储过程实现JSON2table

 
 

  1. public
    class JsonFunction
  2.    {
  3.        /// <summary>
  4.        /// XML转JSON
  5.        /// </summary>
  6.        /// <param name="xml"></param>
  7.        /// <returns></returns>
  8.        /// <remarks>
  9.        /// json不建议太长
  10.        /// </remarks>
  11.        [Microsoft.SqlServer.Server.SqlFunction(Name = "Xml2Json")]
  12.        public
    static SqlString Xml2Json(SqlXml xml)
  13.        {
  14.            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
  15.            doc.LoadXml(xml.Value);
  16.            string json = JsonConvert.SerializeXmlNode(doc, Formatting.Indented);
  17.            doc.Clone();
  18.            return
    new SqlString(json);
  19.        }
  20.        [Microsoft.SqlServer.Server.SqlFunction(Name = "Json2Xml")]
  21.        public
    static SqlXml Json2Xml(string json)
  22.        {
  23.            System.Xml.XmlDocument doc = JsonConvert.DeserializeXmlNode(json);
  24.            System.IO.StringWriter sw = new System.IO.StringWriter();
  25.            doc.WriteTo(new System.Xml.XmlTextWriter(sw));
  26.            return
    new SqlXml(new System.Xml.XmlTextReader(new System.IO.StringReader(sw.ToString())));
  27.        }
  28.        [Microsoft.SqlServer.Server.SqlProcedure(Name = "Json2Table")]
  29.        public
    static
    void Json2Table(string path, string json)
  30.        {
  31.            System.Xml.XmlDocument doc = JsonConvert.DeserializeXmlNode(json);
  32.            System.Xml.XmlNodeList list = null;
  33.            if (!string.IsNullOrEmpty(path))
  34.                list = doc.SelectNodes(path);
  35.            else
  36.                list = doc.ChildNodes;
  37.            if (list == null || list.Count == 0)
  38.                return;
  39.            List<SqlMetaData> metas = new List<SqlMetaData>();
  40.            string lastName = "";
  41.            bool flag = false;
  42.            for (int i = 0; i < list[0].ChildNodes.Count; i++)
  43.            {
  44.                if (lastName == list[0].ChildNodes[i].Name)
  45.                {
  46.                    flag = true;
  47.                    break;
  48.                }
  49.                else
  50.                    lastName = list[0].ChildNodes[i].Name;
  51.                metas.Add(new SqlMetaData(list[0].ChildNodes[i].Name, SqlDbType.NVarChar, SqlMetaData.Max));
  52.            }
  53.            var rec = new SqlDataRecord(metas.ToArray());
  54.            SqlContext.Pipe.SendResultsStart(rec);
  55.            foreach (System.Xml.XmlNode node in list)
  56.            {
  57.                if (flag)//行模式
  58.                    for (int i = 0; i < node.ChildNodes.Count; i++)
  59.                    {
  60.                        rec.SetString(0, node.ChildNodes[i].InnerXml);
  61.                        SqlContext.Pipe.SendResultsRow(rec);
  62.                    }
  63.                else
  64.                {
  65.                    for (int i = 0; i < metas.Count; i++)
  66.                    {
  67.                        rec.SetString(i, node.ChildNodes[i].InnerXml);
  68.                    }
  69.                    SqlContext.Pipe.SendResultsRow(rec);
  70.                }
  71.            }
  72.            SqlContext.Pipe.SendResultsEnd();
  73.        }
  74.        //public static void Json2Table(string json)
  75.        //{
  76.        // //find first array
  77.        // Q.Json.Linq.JObject jo = JsonConvert.DeserializeObject(json) as Q.Json.Linq.JObject;
  78.        // Q.Json.Linq.JToken token = jo.First;
  79.        // while (token != null && token.Type != Q.Json.Linq.JTokenType.Array)
  80.        // {
  81.        // token = token.First;
  82.        // }
  83.        // if (token == null)
  84.        // return;
  85.        // Q.Json.Linq.JArray array = token as Q.Json.Linq.JArray;
  86.        // if (array.Count == 0)
  87.        // return;
  88.        // List<SqlMetaData> metas = new List<SqlMetaData>();
  89.        // token = array[0].First;
  90.        // while (token != null)
  91.        // {
  92.        // metas.Add(new SqlMetaData((token as Q.Json.Linq.JProperty).Name, SqlDbType.NVarChar, SqlMetaData.Max));
  93.        // token = token.Next;
  94.        // }
  95.        // var rec = new SqlDataRecord(metas.ToArray());
  96.        // SqlContext.Pipe.SendResultsStart(rec);
  97.        // foreach (var item in array)
  98.        // {
  99.        // for (int i = 0; i < metas.Count; i++)
  100.        // {
  101.        // rec.SetString(i, item[metas[i].Name].ToString());
  102.        // }
  103.        // SqlContext.Pipe.SendResultsRow(rec);
  104.        // }
  105.        // SqlContext.Pipe.SendResultsEnd();
  106.        //}
  107.    }

 

 
 

测试语句

 
 

  1.  DROP
    TABLE test
  2. CREATE
    TABLE TEST ( NAME VARCHAR(5), DATA XML )
  3. GO
  4. INSERT
    INTO TEST
  5. VALUES ( 'A', '<ROOT><M>AAAA</M></ROOT>' )
  6.         ,
  7.         ( 'B', '<ROOT><D>00000</D></ROOT>' )
  8. , ( '' )
  9. SELECT *
  10. FROM test
  11. --DECLARE @X XML
  12. --SELECT @x = ( SELECT *
  13. -- FROM test
  14. -- FOR
  15. -- XML AUTO ,
  16. -- ELEMENTS ,
  17. -- ROOT
  18. -- )
  19. --SELECT @x
  20. --DECLARE @json NVARCHAR(MAX)
  21. --SELECT @json = dbo.xml2json(@x)
  22. --SELECT @json
  23. --SELECT dbo.Json2Xml(@json)
  24. SELECT dbo.Xml2Json(( SELECT *
  25.                        FROM test
  26.                      FOR
  27.                        XML AUTO ,
  28.                            ELEMENTS ,
  29.                            ROOT
  30.                      )) xml2json
  31. SELECT dbo.Json2Xml(dbo.Xml2Json(( SELECT *
  32.                                     FROM test
  33.                                   FOR
  34.                                     XML AUTO ,
  35.                                         ELEMENTS ,
  36.                                         ROOT
  37.                                   ))) json2xml
  38. SET @json = dbo.Xml2Json(( SELECT *
  39.                            FROM test
  40.                          FOR
  41.                            XML AUTO ,
  42.                                ELEMENTS ,
  43.                                ROOT
  44.                          ))
  45. EXECUTE dbo.json2table 'root/test', @json
  46. EXECUTE dbo.json2table '', @json

 

 
 

执行效果

SQL2008使用json.net实现XML与JSON互转

 
 

参考

http://www.json4sql.com/examples.html

 
 

https://www.simple-talk.com/sql/t-sql-programming/consuming-json-strings-in-sql-server/