c#操作json示例分享
1..NET對(duì)JSON的支持介紹
(1)操作Json的DLL介紹
.NET自身有System.Runtime.Serialization.dll與System.Web.Extensions.dll,使用這兩個(gè)DLL可以把對(duì)象序列化和反序列化成Json數(shù)據(jù)。也可以使用第三方的Newtonsoft.Json.dll來(lái)操作Json數(shù)據(jù),使用它會(huì)更方便的操作Json數(shù)據(jù),其功能也跟強(qiáng)一些。
(2)使用System.Web.Extensions.dll的限制
要使用System.Web.Extensions.dll必須是在Web項(xiàng)目中,只有在Web項(xiàng)目中才能引用此DLL。
2.JSON序列化和反序列化
(1)使用Newtonsoft.Json.dll實(shí)現(xiàn)
代碼示例:
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;//編程語(yǔ)言
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編程語(yǔ)言:");
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));
//序列化對(duì)象
string jsonStr = JsonConvert.SerializeObject(list);//將對(duì)象轉(zhuǎn)換成json存儲(chǔ)
File.WriteAllText(filePath, jsonStr);
list.Clear();
//反序列化對(duì)象
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序列化對(duì)象時(shí),只能序列化對(duì)象的公有成員。
(2)使用System.Web.Extensions.dll實(shí)現(xiàn)
代碼示例:
public class Person
{
public string Name;//姓名
public bool Sex;//性別,是否是男
public Person() { }//必須有此構(gòu)造方法,否者無(wú)法反序列化
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;//編程語(yǔ)言
public Programmer() { }//必須有此構(gòu)造方法,否者無(wú)法反序列化
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編程語(yǔ)言:");
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頁(yè)面的加載事件
{
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));
//序列化對(duì)象
JavaScriptSerializer jsonSerialize = new JavaScriptSerializer();
string jsonStr = jsonSerialize.Serialize(list);//將對(duì)象轉(zhuǎn)換成json存儲(chǔ)
Response.Write(jsonStr + "<br>");//前臺(tái)輸出
//反序列化對(duì)象
list.Clear();
list = jsonSerialize.Deserialize<List<Programmer>>(jsonStr);
foreach (Programmer p in list)
{
Response.Write(p + "<br>");//前臺(tái)輸出
}
}
}
得到的Json文本:
[{"Languages":["C#","Java"],"Name":"李志偉","Sex":true},
{"Languages":["C#","C++"],"Name":"Coder2","Sex":false},
{"Languages":["C#","C++","C","Java"],"Name":"Coder3","Sex":true}]
注意:此種方式Json序列化對(duì)象時(shí),除了只能序列化對(duì)象的公有成員外,被序列化的對(duì)象還必須有無(wú)參的構(gòu)造方法才能被反序列化!System.Web.Extensions.dll只能在Web項(xiàng)目中引用,在控制臺(tái)和WinFrom項(xiàng)目中無(wú)法引用!
(3)使用System.Runtime.Serialization.dll實(shí)現(xiàn)
代碼示例:
[DataContract]//必須申明,否則無(wú)法序列化
public class Person
{
[DataMember(Name = "姓名")]//必須申明,否則無(wú)法序列化
private string Name;
[DataMember(Name = "性別")]//必須申明,否則無(wú)法序列化
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 = "編程語(yǔ)言")]
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編程語(yǔ)言:");
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));
//序列化對(duì)象
DataContractJsonSerializer ser =
new DataContractJsonSerializer(typeof(List<Programmer>));
MemoryStream ms = new MemoryStream();
ser.WriteObject(ms, list);//將對(duì)象轉(zhuǎn)換成json存儲(chǔ)
string jsonStr = Encoding.UTF8.GetString(ms.ToArray());
File.WriteAllText(filePath, jsonStr);
//反序列化對(duì)象
list.Clear();
ms.Position = 0;
list = (List<Programmer>)ser.ReadObject(ms);
foreach (Programmer p in list)
{
Console.WriteLine(p);
}
ms.Dispose();//關(guān)閉內(nèi)存流
Console.WriteLine("OK!");
Console.Read();
}
}
[code]
得到的Json文本:
[{"姓名":"李志偉","性別":true,"編程語(yǔ)言":["C#","Java"]},
{"姓名":"Coder2","性別":false,"編程語(yǔ)言":["C#","C++"]},
{"姓名":"Coder3","性別":true,"編程語(yǔ)言":["C#","C++","C","Java"]}]
注意:此種方式Json序列化對(duì)象時(shí),可以序列化對(duì)象的任意成員(包括私有成員),但是使用此方式必須要在類和成員的定義處加上相應(yīng)的特性(具體請(qǐng)參考代碼)。
(4)小結(jié)
3.解析JSON字符串(使用Newtonsoft.Json.dll)
(1)使用JsonTextReader類進(jìn)行只進(jìn)讀取(不常用)
[code]
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進(jìn)行讀取(常用)
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時(shí)間字符串的處理
class Program
{
static void Main(string[] args)
{
DateTime time = DateTime.Now;
//這里使用自定義日期格式
IsoDateTimeConverter timeConverter = new IsoDateTimeConverter();
timeConverter.DateTimeFormat = "北京時(shí)間:yyyy-MM-dd HH:mm:ss";
//序列化時(shí)間
string JsonStr = JsonConvert.SerializeObject(time, timeConverter);
Console.WriteLine(JsonStr);
//反序列化時(shí)間
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}";
//創(chuàng)建匿名類
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;
//使用索引器訪問(wèn)
Console.WriteLine(O["Name"] + "\t" + O["Sex"] + "\t" + O["Languages"][1]);
Console.Read();
}
}
相關(guān)文章
c#使用win32api實(shí)現(xiàn)獲取光標(biāo)位置
本文給大家匯總了2個(gè)使用C#實(shí)現(xiàn)獲取光標(biāo)位置的代碼,非常的簡(jiǎn)單實(shí)用,第二種方法更為全面,推薦給大家。2016-02-02
在C#中基于Semantic?Kernel的檢索增強(qiáng)生成(RAG)實(shí)踐記錄
SemanticKernel是一個(gè)用于集成和操作大語(yǔ)言模型的應(yīng)用程序框架,支持C#、Python和Java等多種編程語(yǔ)言,通過(guò)SemanticKernel,開(kāi)發(fā)者可以輕松構(gòu)建基于最新AI技術(shù)的應(yīng)用程序2024-10-10
Graphics.DrawImage繪制的圖像變大的原因分析及解決
這篇文章主要介紹了Graphics.DrawImage繪制的圖像變大的原因分析及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Unity實(shí)現(xiàn)手機(jī)搖一搖震動(dòng)
這篇文章主要為大家詳細(xì)介紹了untiy實(shí)現(xiàn)手機(jī)搖一搖震動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
C# 中將數(shù)值型數(shù)據(jù)轉(zhuǎn)換為字節(jié)數(shù)組的方法
C# 中將數(shù)值型數(shù)據(jù)轉(zhuǎn)換為字節(jié)數(shù)組的方法,需要的朋友可以參考一下2013-05-05
WinFrom中l(wèi)abel背景透明的實(shí)現(xiàn)方法
這篇文章主要介紹了WinFrom中l(wèi)abel背景透明的實(shí)現(xiàn)方法,方法簡(jiǎn)單實(shí)用,是C#程序設(shè)計(jì)中非常實(shí)用的技巧,需要的朋友可以參考下2014-09-09

