zoukankan      html  css  js  c++  java
  • C#中怎样将List<自己定义>转为Json格式 及相关函数-DataContractJsonSerializer

    对C#和.net使用List<自己定义>和Json格式相互转化的方法进行总结


    关于JSON的入门介绍见http://www.json.org/ ,或者百度,这里不赘述,只是通过以下的样例会有个更快捷和更直观的认识。

    如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();
            }
        }
    project化时,能够对自己定义数据结构又一次定义一个类:

    如:

    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

    public static string Obj2Json<T>(T data)
    {
        try
        {
            System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(data.GetType());
            using (MemoryStream ms = new MemoryStream())
            {
                serializer.WriteObject(ms, data);
                return Encoding.UTF8.GetString(ms.ToArray());
            }
        }
        catch
        {
            return null;
        }
    }

    Json转List<T>

    public static Object Json2Obj(String json,Type t)
    {
        try
        {
            System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(t);
            using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
            {
                
                return  serializer.ReadObject(ms);
            }
        }
        catch
        {
            return null;
        }
    }

    DataTable 转Json

    public static string DataTable2Json(DataTable dt)
    {
        if (dt.Rows.Count == 0)
        {
            return "";
        }
     
        StringBuilder jsonBuilder = new StringBuilder();
        // jsonBuilder.Append("{"); 
        //jsonBuilder.Append(dt.TableName.ToString());  
        jsonBuilder.Append("[");//转换成多个model的形式
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            jsonBuilder.Append("{");
            for (int j = 0; j < dt.Columns.Count; j++)
            {
                jsonBuilder.Append(""");
                jsonBuilder.Append(dt.Columns[j].ColumnName);
                jsonBuilder.Append("":"");
                jsonBuilder.Append(dt.Rows[i][j].ToString());
                jsonBuilder.Append("",");
            }
            jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
            jsonBuilder.Append("},");
        }
        jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
        jsonBuilder.Append("]");
        //  jsonBuilder.Append("}");
        return jsonBuilder.ToString();
    }

    单个对象转JSON

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

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

     public class JsonHelper
        {
            /// <summary>
            /// 生成Json格式
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="obj"></param>
            /// <returns></returns>
            public static string GetJson<T>(T obj)
            {
                DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType());
                using (MemoryStream stream = new MemoryStream())
                {
                    json.WriteObject(stream, obj);
                    string szJson = Encoding.UTF8.GetString(stream.ToArray()); 
                    return szJson;
                }
            }
            /// <summary>
            /// 获取Json的Model
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="szJson"></param>
            /// <returns></returns>
            public static T ParseFromJson<T>(string szJson)
            {
                T obj = Activator.CreateInstance<T>();
                using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))
                {
                    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
                    return (T)serializer.ReadObject(ms);
                }
            }
        }
     /// <summary>
            /// 反回JSON数据到前台
            /// </summary>
            /// <param name="dt">数据表</param>
            /// <returns>JSON字符串</returns>
            public string DataTableToJson(DataTable dt)
            {
                StringBuilder JsonString = new StringBuilder();
                if (dt != null && dt.Rows.Count > 0)
                {
                    JsonString.Append("{ ");
                    JsonString.Append(""TableInfo":[ ");
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        JsonString.Append("{ ");
                        for (int j = 0; j < dt.Columns.Count; j++)
                        {
                            if (j < dt.Columns.Count - 1)
                            {
                                JsonString.Append(""" + dt.Columns[j].ColumnName.ToString() + "":" + """ + dt.Rows[i][j].ToString() + "",");
                            }
                            else if (j == dt.Columns.Count - 1)
                            {
                                JsonString.Append(""" + dt.Columns[j].ColumnName.ToString() + "":" + """ + dt.Rows[i][j].ToString() + """);
                            }
                        }
                        if (i == dt.Rows.Count - 1)
                        {
                            JsonString.Append("} ");
                        }
                        else
                        {
                            JsonString.Append("}, ");
                        }
                    }
                    JsonString.Append("]}");
                    return JsonString.ToString();
                }
                else
                {
                    return null;
                }
            }

    表的转化Json类:
    public static class JsonTableHelper
        {
            /// <summary> 
            /// 返回对象序列化 
            /// </summary> 
            /// <param name="obj">源对象</param> 
            /// <returns>json数据</returns> 
            public static string ToJson(this object obj)
            {
                JavaScriptSerializer serialize = new JavaScriptSerializer();
                return serialize.Serialize(obj);
            }
    
            /// <summary> 
            /// 控制深度 
            /// </summary> 
            /// <param name="obj">源对象</param> 
            /// <param name="recursionDepth">深度</param> 
            /// <returns>json数据</returns> 
            public static string ToJson(this object obj, int recursionDepth)
            {
                JavaScriptSerializer serialize = new JavaScriptSerializer();
                serialize.RecursionLimit = recursionDepth;
                return serialize.Serialize(obj);
            }
    
            /// <summary> 
            /// DataTable转为json 
            /// </summary> 
            /// <param name="dt">DataTable</param> 
            /// <returns>json数据</returns> 
            public static string ToJson(DataTable dt)
            {
                Dictionary<string, object> dic = new Dictionary<string, object>();
    
                int index = 0;
                foreach (DataRow dr in dt.Rows)
                {
                    Dictionary<string, object> result = new Dictionary<string, object>();
    
                    foreach (DataColumn dc in dt.Columns)
                    {
                        result.Add(dc.ColumnName, dr[dc].ToString());
                    }
                    dic.Add(index.ToString(), result);
                    index++;
                }
                return ToJson(dic);
            }
        }

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

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

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

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


    前台代码:

                var people = [{ "UserName": "t1", "PassWord": "111111", "Sex": "男" },{ "UserName": "t2", "PassWord": "222222", "Sex": "女" }];
                var url = "Default.aspx?

    people=" + escape(people.toJSONString()); request.open("POST", url, true); request.onreadystatechange = updatePage; request.send(null);


    后台处理代码:

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

    [DataContract]//序列化
    public class TestObj
    {
        [DataMember]
        public string UserName { get; set; }
         [DataMember]
        public string PassWord { get; set; }
         [DataMember]
        public string Sex { get; set; }
    
    
    public TestObj(string u,string p,string s)
    	{
            UserName = u;
            PassWord = p;
            Sex = s;
    	}
    }
    

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

    //json 序列化
    
        public static string ToJsJson(object item)
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(item.GetType());
            using(MemoryStream ms=new MemoryStream())
            {
                serializer.WriteObject(ms, item);
                StringBuilder sb = new StringBuilder();
                sb.Append(Encoding.UTF8.GetString(ms.ToArray()));
                return sb.ToString();
            }
        }
    
        //反序列化
    
        public static T FromJsonTo<T>(string jsonString)
        {
            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
            using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
            {
                T jsonObject = (T)ser.ReadObject(ms);
                return jsonObject;
            }
        }

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

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

    终于的结果:

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

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

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

     string Json;
           DataContractJsonSerializer json = new DataContractJsonSerializer(list.GetType());
                    using (MemoryStream stream = new MemoryStream())
                    {
                        json.WriteObject(stream, list);
                         Json = Encoding.UTF8.GetString(stream.ToArray());
                        
                    }
            return Json;   
      /// <summary>
        /// Json的数据结构
        /// </summary>
        [DataContract]
        class ResultJson
        {
            [DataMember]
            public bool Result;
            [DataMember]
            public int Count;
            [DataMember]
            public string Message;
        }

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

      function updatePage() {
                if (request.readyState == 4) {
                    if (request.status == 200) {
                        var response = request.responseText;
                        //转化成对象
                        //方法1
                            response = response.parseJSON();
                        //方法2
                        // response = eval("(" + response + ")");
                        //对象訪问方式
                        document.getElementById("d1").innerHTML = response[1].Sex;
                        //直接输出
                       // document.getElementById("d1").innerHTML = response;
                    }
                }
            }
    

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

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

    {
        "encoding":"UTF-8",
        "plug-ins":["python","c++","ruby"],
        "indent":{
            "length":3,
            "use_space":true
        }
    }
    然后编写对应的序列化的类,注意以下Indent类加的属性:
    [DataContract]
    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]
    class Indent
    {
        [DataMember(Order = 0)]
        public int length { get; set; }
        [DataMember(Order = 1)]
        public bool use_space { get; set; }
    }

    输出JSON字符串


    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.Write
    
  • 相关阅读:
    ZOJ
    Clock(数学题)
    The Lucky Week(规律)
    POJ 3233 Matrix Power Series
    POJ 1061 青蛙的约会(扩展欧几里德算法)
    2266: number
    2263: neighbor
    2269: minval(优先队列)
    HDU
    Problem 2150 Fire Game (广搜+枚举)
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6785751.html
Copyright © 2011-2022 走看看