C#使用DataContractJsonSerializer来进行JSON解析

纵然是瞬间 提交于 2020-10-27 01:51:48

在使用DataContractJsonSerializer进行解析之前,我们首先需要将两个包引入进来:

using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

接下来需要新建一个class,DataContractJsonSerializer可以将JSON字符串转化为指定的class或者将class转化为JSON字符串。

这次我接受的JSON数据格式为:

{ "ret": "0", "Isupdate": "1", "Newver": "V1.1.0" }

我们新建的class也要遵照上述格式,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization;
 
namespace AutoUpdater_Client.Model
{
    //从更新服务器返回的更新信息
    [DataContract]
    class UpdateInfoJSON
    {
        //"{ \"ret\": \"0\", \"Isupdate\": \"1\", \"Newver\": \"V1.1.0\" }";
        //返回值,为0表示获取信息成功
        [DataMember(Order = 0)]
        public int ret { get; set; }
        //是否需要更新,0表示不需要,1表示需要
        [DataMember(Order = 1)]
        public int Isupdate { get; set; }
        //最新版本号
        [DataMember(Order = 2)]
        public string Newver { get; set; }
 
    }
}
请注意上述class中的DataContract和DataMember这两个属性,因为DataContractJsonSerializer在进行序列化的时候需要他们,所以一定要记得加上。
另外,这两个属性的使用也需要引入


























System.Runtime.Serialization

接下来我们可以来写解析的代码了:

string result = "{ \"ret\": \"0\", \"Isupdate\": \"1\", \"Newver\": \"V1.1.0\" }";
//解析从服务端返回的JSON结果
var mStream = new MemoryStream(Encoding.Default.GetBytes(result));
var serializer = new DataContractJsonSerializer(typeof(UpdateInfoJSON));
UpdateInfoJSON updateInfo = (UpdateInfoJSON)serializer.ReadObject(mStream);
接下来就可以访问updateInfo中的各个属性了,完成。
————————————————





//*************JSON-DataContractJsonSerializer解析

C#中使用JSON不需要使用第三方库,使用.NET Framwork3.5自带的System.Runtime.Serialization.Json即可很好的完成JSON的解析。

关于JSON的入门介绍见(首页的图很形象):

http://www.json.org/

一、Using

需要添加引用:System.ServiceModel.Web 和 System.Runtime.Serialization,然后使用Using:

using System.Runtime.Serialization.Json;
using System.Runtime.Serialization;

 二、定义序列化的类

假如我们要转化的JSON字符串格式为:

复制代码

{
    "encoding":"UTF-8",
    "plug-ins":["python","c++","ruby"],
    "indent":{
        "length":3,
        "use_space":true
    }
}






复制代码

 

然后编写相应的序列化的类,注意下面类加的Attribute:

[DataContract(Namespace = "http://coderzh.cnblogs.com")]
class Config
{
    [DataMember(Order = 0)]
    public string encoding { get; set; }
    [DataMember(Order = 1)]
    public string[] plugins { get; set; }
    [DataMember(Order = 2)]
    public Indent indent { get; set; }
}

[DataContract(Namespace = "http://coderzh.cnblogs.com")]
class Indent
{
    [DataMember(Order = 0)]
    public int length { get; set; }
    [DataMember(Order = 1)]
    public bool use_space { get; set; }
}

















三、对象转化为JSON字符串

 

使用WriteObject方法:


var config = new Config(){
                         encoding = "UTF-8",
                         plugins = new string[]{"python", "C++", "C#"},
                         indent = new Indent(){ length = 4, use_space = false}
                         };
var serializer = new DataContractJsonSerializer(typeof(Config));
var stream = new MemoryStream();
serializer.WriteObject(stream, config);

byte[] dataBytes = new byte[stream.Length];

stream.Position = 0;

stream.Read(dataBytes, 0, (int)stream.Length);

string dataString = Encoding.UTF8.GetString(dataBytes);

Console.WriteLine("JSON string is:");
Console.WriteLine(dataString);


















四、JSON字符串转对象

使用ReadObject方法:

ReadObject

 五、输出结果:

复制代码

JSON string is:
{"encoding":"UTF-8","plugins":["python","C++","C#"],"indent":{"length":4,"use_space":false}}
Encoding is: UTF-8
plugins is: python
plugins is: C++
plugins is: C#
indent.length is: 4
indent.use_space is: False






复制代码

 

//***********使用List和Json格式相互转化的总结

如Json格式[{"id":"1","name":"sara"},{"id":"2","name":"sara2"}]

自定义数据类型,用于List<>:

[DataContract]
    class Person {
        [DataMember]
        public int id;
        [DataMember]
        public string name;
    }

 

程序中使用:

首先加入引用:

using System.Runtime.Serialization.Json;
using System.Runtime.Serialization;
using System.Text;

代码内容:

class Program
    {
        static void Main(string[] args)
        {
            //Product.GetAllSmartPhones();
            List<Person> nums = new List<Person>();
            nums.Add(new Person() { 
                id=1,
                name="sara"
            });
            nums.Add(new Person() { 
                id=1,
                name="sylar"
            });

            DataContractJsonSerializer json = new DataContractJsonSerializer(nums.GetType());

            string szJson = "";

            //序列化

            using (MemoryStream stream = new MemoryStream())
            {

                json.WriteObject(stream, nums);

                szJson = Encoding.UTF8.GetString(stream.ToArray());

            }
            Console.WriteLine(szJson);
            Console.ReadLine();
        }
    }

工程化时,可以对自定义数据结构重新定义一个类:

如:

public class TestListResult<T> : List<T>
    {
        public TestListResult()
        {
            this.Successed = false;
            this.Message = "";
        }
        public bool Successed { get; set; }
        public string Message { get; set; }
    }








使用时同上在一个文件里一样

理解了以上原理,可以使用以下函数在项目中使用:

List<T>转Json

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. public static string Obj2Json<T>(T data)  
  2. {  
  3.     try  
  4.     {  
  5.         System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(data.GetType());  
  6.         using (MemoryStream ms = new MemoryStream())  
  7.         {  
  8.             serializer.WriteObject(ms, data);  
  9.             return Encoding.UTF8.GetString(ms.ToArray());  
  10.         }  
  11.     }  
  12.     catch  
  13.     {  
  14.         return null;  
  15.     }  
  16. }  


Json转List<T>

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. public static Object Json2Obj(String json,Type t)  
  2. {  
  3.     try  
  4.     {  
  5.         System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(t);  
  6.         using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))  
  7.         {  
  8.               
  9.             return  serializer.ReadObject(ms);  
  10.         }  
  11.     }  
  12.     catch  
  13.     {  
  14.         return null;  
  15.     }  
  16. }  


DataTable 转Json

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. public static string DataTable2Json(DataTable dt)  
  2. {  
  3.     if (dt.Rows.Count == 0)  
  4.     {  
  5.         return "";  
  6.     }  
  7.    
  8.     StringBuilder jsonBuilder = new StringBuilder();  
  9.     // jsonBuilder.Append("{");   
  10.     //jsonBuilder.Append(dt.TableName.ToString());    
  11.     jsonBuilder.Append("[");//转换成多个model的形式  
  12.     for (int i = 0; i < dt.Rows.Count; i++)  
  13.     {  
  14.         jsonBuilder.Append("{");  
  15.         for (int j = 0; j < dt.Columns.Count; j++)  
  16.         {  
  17.             jsonBuilder.Append("\"");  
  18.             jsonBuilder.Append(dt.Columns[j].ColumnName);  
  19.             jsonBuilder.Append("\":\"");  
  20.             jsonBuilder.Append(dt.Rows[i][j].ToString());  
  21.             jsonBuilder.Append("\",");  
  22.         }  
  23.         jsonBuilder.Remove(jsonBuilder.Length - 1, 1);  
  24.         jsonBuilder.Append("},");  
  25.     }  
  26.     jsonBuilder.Remove(jsonBuilder.Length - 1, 1);  
  27.     jsonBuilder.Append("]");  
  28.     //  jsonBuilder.Append("}");  
  29.     return jsonBuilder.ToString();  
  30. }  


单个对象转JSON

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. public static T Json2Obj<T>(string json)   
  2. {  
  3.     T obj = Activator.CreateInstance<T>();  
  4.     using (System.IO.MemoryStream ms = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(json)))  
  5.     {  
  6.         System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType());  
  7.         return (T)serializer.ReadObject(ms);  
  8.     }  
  9. }  


将函数封装成类,更便于项目中引用:

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. public class JsonHelper  
  2.    {  
  3.        /// <summary>  
  4.        /// 生成Json格式  
  5.        /// </summary>  
  6.        /// <typeparam name="T"></typeparam>  
  7.        /// <param name="obj"></param>  
  8.        /// <returns></returns>  
  9.        public static string GetJson<T>(T obj)  
  10.        {  
  11.            DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType());  
  12.            using (MemoryStream stream = new MemoryStream())  
  13.            {  
  14.                json.WriteObject(stream, obj);  
  15.                string szJson = Encoding.UTF8.GetString(stream.ToArray());   
  16.                return szJson;  
  17.            }  
  18.        }  
  19.        /// <summary>  
  20.        /// 获取Json的Model  
  21.        /// </summary>  
  22.        /// <typeparam name="T"></typeparam>  
  23.        /// <param name="szJson"></param>  
  24.        /// <returns></returns>  
  25.        public static T ParseFromJson<T>(string szJson)  
  26.        {  
  27.            T obj = Activator.CreateInstance<T>();  
  28.            using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))  
  29.            {  
  30.                DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());  
  31.                return (T)serializer.ReadObject(ms);  
  32.            }  
  33.        }  
  34.    }  

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. /// <summary>  
  2.        /// 反回JSON数据到前台  
  3.        /// </summary>  
  4.        /// <param name="dt">数据表</param>  
  5.        /// <returns>JSON字符串</returns>  
  6.        public string DataTableToJson(DataTable dt)  
  7.        {  
  8.            StringBuilder JsonString = new StringBuilder();  
  9.            if (dt != null && dt.Rows.Count > 0)  
  10.            {  
  11.                JsonString.Append("{ ");  
  12.                JsonString.Append("\"TableInfo\":[ ");  
  13.                for (int i = 0; i < dt.Rows.Count; i++)  
  14.                {  
  15.                    JsonString.Append("{ ");  
  16.                    for (int j = 0; j < dt.Columns.Count; j++)  
  17.                    {  
  18.                        if (j < dt.Columns.Count - 1)  
  19.                        {  
  20.                            JsonString.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + "\"" + dt.Rows[i][j].ToString() + "\",");  
  21.                        }  
  22.                        else if (j == dt.Columns.Count - 1)  
  23.                        {  
  24.                            JsonString.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + "\"" + dt.Rows[i][j].ToString() + "\"");  
  25.                        }  
  26.                    }  
  27.                    if (i == dt.Rows.Count - 1)  
  28.                    {  
  29.                        JsonString.Append("} ");  
  30.                    }  
  31.                    else  
  32.                    {  
  33.                        JsonString.Append("}, ");  
  34.                    }  
  35.                }  
  36.                JsonString.Append("]}");  
  37.                return JsonString.ToString();  
  38.            }  
  39.            else  
  40.            {  
  41.                return null;  
  42.            }  
  43.        }  


表的转化Json类:

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. public static class JsonTableHelper  
  2.     {  
  3.         /// <summary>   
  4.         /// 返回对象序列化   
  5.         /// </summary>   
  6.         /// <param name="obj">源对象</param>   
  7.         /// <returns>json数据</returns>   
  8.         public static string ToJson(this object obj)  
  9.         {  
  10.             JavaScriptSerializer serialize = new JavaScriptSerializer();  
  11.             return serialize.Serialize(obj);  
  12.         }  
  13.   
  14.         /// <summary>   
  15.         /// 控制深度   
  16.         /// </summary>   
  17.         /// <param name="obj">源对象</param>   
  18.         /// <param name="recursionDepth">深度</param>   
  19.         /// <returns>json数据</returns>   
  20.         public static string ToJson(this object obj, int recursionDepth)  
  21.         {  
  22.             JavaScriptSerializer serialize = new JavaScriptSerializer();  
  23.             serialize.RecursionLimit = recursionDepth;  
  24.             return serialize.Serialize(obj);  
  25.         }  
  26.   
  27.         /// <summary>   
  28.         /// DataTable转为json   
  29.         /// </summary>   
  30.         /// <param name="dt">DataTable</param>   
  31.         /// <returns>json数据</returns>   
  32.         public static string ToJson(DataTable dt)  
  33.         {  
  34.             Dictionary<string, object> dic = new Dictionary<string, object>();  
  35.   
  36.             int index = 0;  
  37.             foreach (DataRow dr in dt.Rows)  
  38.             {  
  39.                 Dictionary<string, object> result = new Dictionary<string, object>();  
  40.   
  41.                 foreach (DataColumn dc in dt.Columns)  
  42.                 {  
  43.                     result.Add(dc.ColumnName, dr[dc].ToString());  
  44.                 }  
  45.                 dic.Add(index.ToString(), result);  
  46.                 index++;  
  47.             }  
  48.             return ToJson(dic);  
  49.         }  
  50.     }  


在Asp.net中前后台Json数据的传递

一、前台产生Json数据传递给后台处理

前台生成Json数据要使用javascript和json.js。

json.js 下载地址:http://www.json.org/json.js

 

 

前台代码:

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. var people = [{ "UserName": "t1", "PassWord": "111111", "Sex": "男" },{ "UserName": "t2", "PassWord": "222222", "Sex": "女" }];  
  2. var url = "Default.aspx?people=" + escape(people.toJSONString());  
  3. request.open("POST", url, true);  
  4. request.onreadystatechange = updatePage;  
  5. request.send(null);  


后台处理代码:

同上面的转化原理一样,我们先建立一个json数据类,便于List<>中使用。

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. [DataContract]//序列化  
  2. public class TestObj  
  3. {  
  4.     [DataMember]  
  5.     public string UserName { get; set; }  
  6.      [DataMember]  
  7.     public string PassWord { get; set; }  
  8.      [DataMember]  
  9.     public string Sex { get; set; }  
  10.   
  11.   
  12. public TestObj(string u,string p,string s)  
  13.     {  
  14.         UserName = u;  
  15.         PassWord = p;  
  16.         Sex = s;  
  17.     }  
  18. }  


对前台提交的Json数据相互转化函数

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. //json 序列化  
  2.   
  3.     public static string ToJsJson(object item)  
  4.     {  
  5.         DataContractJsonSerializer serializer = new DataContractJsonSerializer(item.GetType());  
  6.         using(MemoryStream ms=new MemoryStream())  
  7.         {  
  8.             serializer.WriteObject(ms, item);  
  9.             StringBuilder sb = new StringBuilder();  
  10.             sb.Append(Encoding.UTF8.GetString(ms.ToArray()));  
  11.             return sb.ToString();  
  12.         }  
  13.     }  
  14.   
  15.     //反序列化  
  16.   
  17.     public static T FromJsonTo<T>(string jsonString)  
  18.     {  
  19.         DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));  
  20.         using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))  
  21.         {  
  22.             T jsonObject = (T)ser.ReadObject(ms);  
  23.             return jsonObject;  
  24.         }  
  25.     }  


在后台代码中调用以上函数进行对数据people的处理:

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. //获取json字符串  
  2.        string jsonStr = Request["people"];  
  3.        List<TestObj> obj = Json.FromJsonTo<List<TestObj>>(jsonStr);  
  4.        foreach (TestObj item in obj)  
  5.            {  
  6.         Response.Write(string.Format("UserName:{0},Password:{1},Sex:{2}/r/n", item.UserName, item.PassWord, item.Sex));  
  7.            }  
  8.        Response.End();  


最终的结果:

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. List<TestObj> Users = new List<TestObj>();  
  2. Users.Add(new TestObj("t1", "1", "男"));  
  3. Users.Add(new TestObj("t2", "2", "女"));  
  4. string json = Json.ToJsJson(Users);  
  5. Response.Write(json);  
  6. Response.End();  


二、前台获取后台提交的Json数据

后台产生Json数据的方法如上原理中提到的:

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. string Json;  
  2.       DataContractJsonSerializer json = new DataContractJsonSerializer(list.GetType());  
  3.                using (MemoryStream stream = new MemoryStream())  
  4.                {  
  5.                    json.WriteObject(stream, list);  
  6.                     Json = Encoding.UTF8.GetString(stream.ToArray());  
  7.                      
  8.                }  
  9.        return Json;     

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. /// <summary>  
  2.   /// Json的数据结构  
  3.   /// </summary>  
  4.   [DataContract]  
  5.   class ResultJson  
  6.   {  
  7.       [DataMember]  
  8.       public bool Result;  
  9.       [DataMember]  
  10.       public int Count;  
  11.       [DataMember]  
  12.       public string Message;  
  13.   }  


前台获取后台返回的Json字符串:
 

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. function updatePage() {  
  2.           if (request.readyState == 4) {  
  3.               if (request.status == 200) {  
  4.                   var response = request.responseText;  
  5.                   //转化成对象  
  6.                   //方法1  
  7.                       response = response.parseJSON();  
  8.                   //方法2  
  9.                   // response = eval("(" + response + ")");  
  10.                   //对象访问方式  
  11.                   document.getElementById("d1").innerHTML = response[1].Sex;  
  12.                   //直接输出  
  13.                  // document.getElementById("d1").innerHTML = response;  
  14.               }  
  15.           }  
  16.       }  


复杂的Json字符串操作方法:

假如我们要转化的JSON字符串格式为:

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. {  
  2.     "encoding":"UTF-8",  
  3.     "plug-ins":["python","c++","ruby"],  
  4.     "indent":{  
  5.         "length":3,  
  6.         "use_space":true  
  7.     }  
  8. }  

然后编写相应的序列化的类,注意下面Indent类加的属性:

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. [DataContract]  
  2. class Config  
  3. {  
  4.     [DataMember(Order = 0)]  
  5.     public string encoding { get; set; }  
  6.     [DataMember(Order = 1)]  
  7.     public string[] plugins { get; set; }  
  8.     [DataMember(Order = 2)]  
  9.     public Indent indent { get; set; }  
  10. }  
  11.   
  12. [DataContract]  
  13. class Indent  
  14. {  
  15.     [DataMember(Order = 0)]  
  16.     public int length { get; set; }  
  17.     [DataMember(Order = 1)]  
  18.     public bool use_space { get; set; }  
  19. }  

 

输出JSON字符串

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. var config = new Config(){  
  2.                          encoding = "UTF-8",  
  3.                          plugins = new string[]{"python", "C++", "C#"},  
  4.                          indent = new Indent(){ length = 4, use_space = false}  
  5.                          };  
  6. var serializer = new DataContractJsonSerializer(typeof(Config));  
  7. var stream = new MemoryStream();  
  8. serializer.WriteObject(stream, config);  
  9.   
  10. byte[] dataBytes = new byte[stream.Length];  
  11.   
  12. stream.Position = 0;  
  13.   
  14. stream.Read(dataBytes, 0, (int)stream.Length);  
  15.   
  16. string dataString = Encoding.UTF8.GetString(dataBytes);  
  17.   
  18. Console.WriteLine("JSON string is:");  
  19. Console.WriteLine(dataString);  

结果:

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. JSON string is:  
  2. {"encoding":"UTF-8","plugins":["python","C++","C#"],"indent":{"length":4,"use_space":false}}  


读取Json字符串内容:

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. var mStream = new MemoryStream(Encoding.Default.GetBytes(dataString));  
  2. Config readConfig = (Config)serializer.ReadObject(mStream);  
  3.   
  4. Console.WriteLine("Encoding is: {0}", readConfig.encoding);  
  5. foreach (string plugin in readConfig.plugins)  
  6. {  
  7.     Console.WriteLine("plugins is: {0}", plugin);  
  8. }  
  9. Console.WriteLine("indent.length is: {0}", readConfig.indent.length);  
  10. Console.WriteLine("indent.use_space is: {0}", readConfig.indent.use_space);  

结果:

[html] view plaincopy在CODE上查看代码片派生到我的代码片

  1. Encoding is: UTF-8  
  2. plugins is: python  
  3. plugins is: C++  
  4. plugins is: C#  
  5. indent.length is: 4  
  6. indent.use_space is: False  
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!