C#操作Json(轉)


原文:http://wenku.baidu.com/link?url=3dlqKdF26ZdQIAcX9jvP2ZYEtl3J0sKOV8XuHQI0Rz4SjB9S46nqmGiMXUVQa_1PmUAVYWdFtWFkVP3ACT2SJ_xBZn8fVAynNTn6k1kYdnC#rd

 官方幫助文檔:http://james.newtonking.com/json/help/index.html

1. .NET對JSON的支持介紹 1

(1) 操作Json的DLL介紹 1

(2) 使用System.Web.Extensions.dll的限制 1

2. JSON序列化和反序列化 1

(1) 使用Newtonsoft.Json.dll實現 1

(2) 使用System.Web.Extensions.dll實現 2

(3) 使用System.Runtime.Serialization.dll實現 3

(4) 小結 5

3. 解析JSON字符串(使用Newtonsoft.Json.dll) 5

(1) 使用JsonTextReader類進行只進讀取(不常用) 5

(2) 使用JArray、JObject、JToken進行讀取(常用) 5

(3) Json時間字符串的處理 6

4. 讀取Json字符串的技巧 6

(1) 使用匿名類 6

(2) 使用索引器 6

作者:李志偉

時間:2014-03-25

 

1..NET對JSON的支持介紹

(1)操作Json的DLL介紹

.NET自身有System.Runtime.Serialization.dll與System.Web.Extensions.dll,使用這兩個DLL可以把對象序列化和反序列化成Json數據。

也可以使用第三方的Newtonsoft.Json.dll來操作Json數據,使用它會更方便的操作Json數據,其功能也跟強一些。下載地址:http://json.codeplex.com/

(2)使用System.Web.Extensions.dll的限制

要使用System.Web.Extensions.dll必須是在Web項目中,只有在Web項目中才能引用此DLL。

2.JSON序列化和反序列化

(1)使用Newtonsoft.Json.dll實現

代碼示例:

    public class Person

    {

        public string Name;//姓名

        public bool Sex;//性別,是否是男

        public Person(string name, bool sex)

        {

            this.Name = name;

            this.Sex = sex;

        }

        public override string ToString()

        {

            return "姓名:" + this.Name + "\t性別:" + (this.Sex ? "男" : "女");

        }

    }

    public class Programmer : Person

    {

        public List<string> Languages;//編程語言

        public Programmer(string name, bool sex, List<string> languages) : base(name, sex)

        {

            this.Languages = languages;

        }

        public override string ToString()

        {

            StringBuilder str = new StringBuilder();

            str.Append(base.ToString() + "\t編程語言:");

            foreach (string l in this.Languages)

            {

                str.Append(l + " ");

            }

            return str.ToString();

        }

    }

    class Program

    {

        static void Main(string[] args)

        {

            string filePath = @"D:\users\lizw\桌面\ObjectJson.txt";

            List<string> languages = null;

            List<Programmer> list = new List<Programmer>();

            languages = new List<string>(new string[] { "C#", "Java" });

            list.Add(new Programmer("李志偉", true, languages));

            languages = new List<string>(new string[] { "C#", "C++" });

            list.Add(new Programmer("Coder2", false, languages));

            languages = new List<string>(new string[] { "C#", "C++", "C", "Java" });

            list.Add(new Programmer("Coder3", true, languages));

            //序列化對象

            string jsonStr = JsonConvert.SerializeObject(list);//將對象轉換成json存儲

            File.WriteAllText(filePath, jsonStr);

            list.Clear();

            //反序列化對象

            list = JsonConvert.DeserializeObject<List<Programmer>>(jsonStr);

            foreach (Programmer p in list)

            {

                Console.WriteLine(p);

            }

            Console.WriteLine("OK!");

            Console.Read();

        }

    }

得到的Json文本:

[{"Languages":["C#","Java"],"Name":"李志偉","Sex":true},

{"Languages":["C#","C++"],"Name":"Coder2","Sex":false},

{"Languages":["C#","C++","C","Java"],"Name":"Coder3","Sex":true}]

注意:此種方式Json序列化對象時,只能序列化對象的公有成員。

(2)使用System.Web.Extensions.dll實現

代碼示例:

    public class Person

    {

        public string Name;//姓名

        public bool Sex;//性別,是否是男

        public Person() { }//必須有此構造方法,否者無法反序列化

        public Person(string name, bool sex)

        {

            this.Name = name;

            this.Sex = sex;

        }

        public override string ToString()

        {

            return "姓名:" + this.Name + "\t性別:" + (this.Sex ? "男" : "女");

        }

    }

    public class Programmer : Person

    {

        public List<string> Languages;//編程語言

        public Programmer() { }//必須有此構造方法,否者無法反序列化

        public Programmer(string name, bool sex, List<string> languages)

            : base(name, sex)

        {

            this.Languages = languages;

        }

        public override string ToString()

        {

            StringBuilder str = new StringBuilder();

            str.Append(base.ToString() + "\t編程語言:");

            foreach (string l in this.Languages)

            {

                str.Append(l + " ");

            }

            return str.ToString();

        }

    }

    public partial class WebForm1 : System.Web.UI.Page

    {

        protected void Page_Load(object sender, EventArgs e)//Web頁面的加載事件

        {

            List<string> languages = null;

            List<Programmer> list = new List<Programmer>();

            languages = new List<string>(new string[] { "C#", "Java" });

            list.Add(new Programmer("李志偉", true, languages));

            languages = new List<string>(new string[] { "C#", "C++" });

            list.Add(new Programmer("Coder2", false, languages));

            languages = new List<string>(new string[] { "C#", "C++", "C", "Java" });

            list.Add(new Programmer("Coder3", true, languages));

            //序列化對象

            JavaScriptSerializer jsonSerialize = new JavaScriptSerializer();

            string jsonStr = jsonSerialize.Serialize(list);//將對象轉換成json存儲

            Response.Write(jsonStr + "<br>");//前台輸出

            //反序列化對象

            list.Clear();

            list = jsonSerialize.Deserialize<List<Programmer>>(jsonStr);

            foreach (Programmer p in list)

            {

                Response.Write(p + "<br>");//前台輸出

            }

        }

    }

得到的Json文本:

[{"Languages":["C#","Java"],"Name":"李志偉","Sex":true},

{"Languages":["C#","C++"],"Name":"Coder2","Sex":false},

{"Languages":["C#","C++","C","Java"],"Name":"Coder3","Sex":true}]

注意:此種方式Json序列化對象時,除了只能序列化對象的公有成員外,被序列化的對象還必須有無參的構造方法才能被反序列化!System.Web.Extensions.dll只能在Web項目中引用,在控制台和WinFrom項目中無法引用!

(3)使用System.Runtime.Serialization.dll實現

代碼示例:

    [DataContract]//必須申明,否則無法序列化

    public class Person

    {

        [DataMember(Name = "姓名")]//必須申明,否則無法序列化

        private string Name;

        [DataMember(Name = "性別")]//必須申明,否則無法序列化

        private bool Sex;

        public Person(string name, bool sex)

        {

            this.Name = name;

            this.Sex = sex;

        }

        public override string ToString()

        {

            return "姓名:" + this.Name + "\t性別:" + (this.Sex ? "男" : "女");

        }

    }

    [DataContract]

    public class Programmer : Person

    {

        [DataMember(Name = "編程語言")]

        private List<string> Languages;

        public Programmer(string name, bool sex, List<string> languages)

            : base(name, sex)

        {

            this.Languages = languages;

        }

        public override string ToString()

        {

            StringBuilder str = new StringBuilder();

            str.Append(base.ToString() + "\t編程語言:");

            foreach (string l in this.Languages)

            {

                str.Append(l + " ");

            }

            return str.ToString();

        }

    }

    class Program

    {

        static void Main(string[] args)

        {

            string filePath = @"D:\users\lizw\桌面\ObjectJson.txt";

            List<string> languages = null;

            List<Programmer> list = new List<Programmer>();

            languages = new List<string>(new string[] { "C#", "Java" });

            list.Add(new Programmer("李志偉", true, languages));

            languages = new List<string>(new string[] { "C#", "C++" });

            list.Add(new Programmer("Coder2", false, languages));

            languages = new List<string>(new string[] { "C#", "C++", "C", "Java" });

            list.Add(new Programmer("Coder3", true, languages));

            //序列化對象

            DataContractJsonSerializer ser = 

new DataContractJsonSerializer(typeof(List<Programmer>));

            MemoryStream ms = new MemoryStream();

            ser.WriteObject(ms, list);//將對象轉換成json存儲

            string jsonStr = Encoding.UTF8.GetString(ms.ToArray());

            File.WriteAllText(filePath, jsonStr);

            //反序列化對象

            list.Clear();

            ms.Position = 0;

            list = (List<Programmer>)ser.ReadObject(ms);

            foreach (Programmer p in list)

            {

                Console.WriteLine(p);

            }

            ms.Dispose();//關閉內存流

            Console.WriteLine("OK!");

            Console.Read();

        }

    }

得到的Json文本:

[{"姓名":"李志偉","性別":true,"編程語言":["C#","Java"]},

{"姓名":"Coder2","性別":false,"編程語言":["C#","C++"]},

{"姓名":"Coder3","性別":true,"編程語言":["C#","C++","C","Java"]}]

注意:此種方式Json序列化對象時,可以序列化對象的任意成員(包括私有成員),但是使用此方式必須要在類和成員的定義處加上相應的特性(具體請參考代碼)。

(4)小結

使用的DLL

序列化范圍

項目范圍

依賴構造器

依賴特性

Newtonsoft.Json.dll

公有成員

任意項目

System.Web.Extensions.dll

公有成員

Web項目

無參構造器

System.Runtime.Serialization.dll

所有成員

任意項目

3.解析JSON字符串(使用Newtonsoft.Json.dll)

(1)使用JsonTextReader類進行只進讀取(不常用)

    class Program

    {

        static void Main(string[] args)

        {

            //Json字符串

            string jsonStr = @"

                [{'Languages':['C#','Java'],'Name':'李志偉','Sex':true},

                {'Languages':['C#','C++'],'Name':'Coder2','Sex':false},

                {'Languages':['C#','C++','C','Java'],'Name':'Coder3','Sex':true}]";

            JsonTextReader json = new JsonTextReader(new StringReader(jsonStr));

            while (json.Read())

            {

                Console.WriteLine(json.Value + "--" + json.TokenType + "--" + json.ValueType);

            }

            Console.WriteLine("OK!");

            Console.Read();

        }

    }

(2)使用JArray、JObject、JToken進行讀取(常用)

    class Program

    {

        static void Main(string[] args)

        {

            //Json字符串

            string jsonStr = @"

                [{'Languages':['C#','Java'],'Name':'李志偉','Sex':true},

                {'Languages':['C#','C++'],'Name':'Coder2','Sex':false},

                {'Languages':['C#','C++','C','Java'],'Name':'Coder3','Sex':true}]";

            JArray ja = (JArray)JsonConvert.DeserializeObject(jsonStr);

            foreach (JToken jt in ja)

            {

                JObject jo = (JObject)jt;

                JArray temp = (JArray)jo["Languages"];

                foreach (JToken token in temp)

                {

                    Console.Write(token+" ");

                }

                Console.WriteLine("\t" + jo["Name"] + "\t" + jo["Sex"]);

            }

            Console.WriteLine("OK!");

            Console.Read();

        }

    }

(3)Json時間字符串的處理

    class Program

    {

        static void Main(string[] args)

        {

            DateTime time = DateTime.Now;

            //這里使用自定義日期格式

            IsoDateTimeConverter timeConverter = new IsoDateTimeConverter();

            timeConverter.DateTimeFormat = "北京時間:yyyy-MM-dd HH:mm:ss";

            //序列化時間

            string JsonStr = JsonConvert.SerializeObject(time, timeConverter);

            Console.WriteLine(JsonStr);

            //反序列化時間

            DateTime time2 = JsonConvert.DeserializeObject<DateTime>(JsonStr, timeConverter);

            Console.WriteLine(time2);

            Console.WriteLine("OK!");

            Console.Read();

        }

    }

4.讀取Json字符串的技巧

(1)使用匿名類

    class Program

    {

        static void Main(string[] args)

        {

            //Json字符串

            string jsonStr = @"{'Languages':['C#','Java'],'Name':'李志偉','Sex':true}";

            //創建匿名類

            var TempClass = new { Languages = new string[0], Name = string.Empty, Sex = false };

            //反序列化

            var O = JsonConvert.DeserializeAnonymousType(jsonStr, TempClass);

            Console.WriteLine(O.Name+"\t"+O.Sex+"\t"+O.Languages[1]);

            Console.Read();

        }

    }

(2)使用索引器

    class Program

    {

        static void Main(string[] args)

        {

            //Json字符串

            string jsonStr = @"{'Languages':['C#','Java'],'Name':'李志偉','Sex':true}";

            //反序列化

            JObject O = JsonConvert.DeserializeObject(jsonStr) as JObject;

            //使用索引器訪問

            Console.WriteLine(O["Name"] + "\t" + O["Sex"] + "\t" + O["Languages"][1]);

            Console.Read();

        }

    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM