JSON(全稱為JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式唆途。它是基于JavaScript語法標(biāo)準(zhǔn)的一個子集。 JSON采用完全獨(dú)立于語言的文本格式蒲犬,可以很容易在各種網(wǎng)絡(luò)、平臺和程序之間傳輸岸啡。JSON的語法很簡單原叮,易于人閱讀和編寫,同時也易于機(jī)器解析和生成巡蘸。
JSON與XML的比較
可讀性
JSON和XML的可讀性相比較而言奋隶,由于XML提供輔助的標(biāo)簽,更加適合人閱讀和理解悦荒。
文件大小與傳輸
XML允許使用方便的標(biāo)簽达布,所以文件尺寸是要比JSON大的。而且JSON源于Javascript逾冬,所以天生的主戰(zhàn)場是Javascript與網(wǎng)絡(luò)黍聂,在這里,JSON有著XML無法趕超的優(yōu)勢身腻。
JSON語法
1. JSON 語法是 JavaScript 對象表示法語法的子集产还。
數(shù)據(jù)在名稱/值對中:名稱是字符串,使用雙引號表示嘀趟。值可以是:數(shù)字(整數(shù)或浮點(diǎn)數(shù))脐区,字符串(在雙引號中),數(shù)組(在方括號中),對象(在花括號中),true/false/null她按。
數(shù)據(jù)由逗號分隔:
花括號保存對象:對象可以包含各種數(shù)據(jù)牛隅,包括數(shù)組炕柔。
方括號保存數(shù)組:數(shù)字可以包含對象。
例如:
{
? ? "employees": [
? ? ? ? {
? ? ? ? ? ? "firstName": "Bill",
? ? ? ? ? ? "lastName": "Gates"
? ? ? ? },
? ? ? ? {
? ? ? ? ? ? "firstName": "George",
? ? ? ? ? ? "lastName": "Bush"
? ? ? ? }
? ? ]
}
2. 如果JSON中含有轉(zhuǎn)義字符媒佣,則需要轉(zhuǎn)義匕累。例如文件路徑中需要使用"\\"而不是"\"。例如:{ "file":"C:\\a.txt"}默伍。
.NET操作JSON
JSON文件讀入到內(nèi)存中就是字符串欢嘿,.NET操作JSON就是生成與解析JSON字符串。操作JSON通常有以下幾種方式:
1. 原始方式 :自己按照J(rèn)SON的語法格式也糊,寫代碼直接操作JSON字符串炼蹦。如非必要,應(yīng)該很少人會走這條路狸剃,從頭再來的掐隐。
2. 通用方式【】 :
這種方式是使用開源的類庫Newtonsoft.Json(下載地址http://json.codeplex.com/ )。下載后加入工程就能用钞馁。通陈鞘。可以使用JObject, JsonReader, JsonWriter處理。這種方式最通用指攒,也最靈活慷妙,可以隨時修改不爽的地方僻焚。
(1)使用JsonReader讀Json字符串:
string jsonText = @"{""input"" : ""value"", ""output"" : ""result""}";
JsonReader reader = new? JsonTextReader(new? StringReader(jsonText));
while? (reader.Read())
{
? ? Console.WriteLine(reader.TokenType + "\t\t" + reader.ValueType + "\t\t" + reader.Value);
}
(2)使用JsonWriter寫字符串:
StringWriter sw = new? StringWriter();
JsonWriter writer = new? JsonTextWriter(sw);
writer.WriteStartObject();
writer.WritePropertyName(" input " );
writer.WriteValue(" value " );
writer.WritePropertyName(" output " );
writer.WriteValue(" result " );
writer.WriteEndObject();
writer.Flush();
string? jsonText = sw.GetStringBuilder().ToString();
Console.WriteLine(jsonText);
(3)使用JObject讀寫字符串:
JObject jo = JObject.Parse(jsonText);
string [] values = jo.Properties().Select(item => item.Value.ToString()).ToArray();
(4)使用JsonSerializer讀寫對象(基于JsonWriter與JsonReader):
數(shù)組型數(shù)據(jù)
string
jsonArrayText1 = "
[{'a':'a1','b':'b1'},{'a':'a2','b':'b2'}]
"
;
JArray ja
= (JArray)JsonConvert.DeserializeObject(jsonArrayText1);
string
ja1a = ja[1
]["
a
"
].ToString();
//
或者
JObject o = (JObject)ja[1
];
string
oa = o["
a
"
].ToString();
嵌套格式
string
jsonText = "
{\"beijing\":{\"zone\":\"海淀\",\"zone_en\":\"haidian\"}}
"
;
JObject jo
= (JObject)JsonConvert.DeserializeObject(jsonText);
string
zone = jo["
beijing
"
]["
zone
"
].ToString();
string
zone_en = jo["
beijing
"
]["
zone_en
"
].ToString();
自定義類Project
Project p = new? Project() { Input = " stone " , Output = " gold "? };
JsonSerializer serializer = new? JsonSerializer();
StringWriter sw = new? StringWriter();
serializer.Serialize(new? JsonTextWriter(sw), p);
Console.WriteLine(sw.GetStringBuilder().ToString());
StringReader sr = new? StringReader(@" {""Input"":""stone"", ""Output"":""gold""} " );
Project p1 = (Project)serializer.Deserialize(new? JsonTextReader(sr), typeof (Project));
Console.WriteLine(p1.Input + " => "? + p1.Output);
上面的代碼都是基于下面這個Project類定義:
class? Project
{
? ? public? string? Input { get ; set ; }
? ? public? string? Output { get ; set ; }
}
此外允悦,如果上面的JsonTextReader等類編譯不過的話,說明是我們自己修改過的類虑啤,換成你們自己的相關(guān)類就可以了隙弛,不影響使用。
3. 內(nèi)置方式 :使用.NET Framework 3.5/4.0中提供的System.Web.Script.Serialization命名空間下的JavaScriptSerializer類進(jìn)行對象的序列化與反序列化狞山,很直接全闷。
Project p = new? Project() { Input = " stone " , Output = " gold "? };
JavaScriptSerializer serializer = new? JavaScriptSerializer();
var? json = serializer.Serialize(p);
Console.WriteLine(json);
var? p1 = serializer.Deserialize<Project>(json);
Console.WriteLine(p1.Input + " => "? + p1.Output);
Console.WriteLine(ReferenceEquals(p,p1));
注意: 如果使用的是VS2010,則要求當(dāng)前的工程的Target Framework要改成.Net Framework 4萍启,不能使用Client Profile总珠。當(dāng)然這個System.Web.Extensions.dll主要是Web使用的,直接在Console工程中用感覺有點(diǎn)浪費(fèi)資源勘纯。
此外局服,從最后一句也可以看到,序列化與反序列化是深拷貝的一種典型的實(shí)現(xiàn)方式 驳遵。
4. 契約方式 :使用System.Runtime.Serialization.dll提供的DataContractJsonSerializer或者 JsonReaderWriterFactory實(shí)現(xiàn)淫奔。
Project p = new? Project() { Input = " stone " , Output = " gold "? };
DataContractJsonSerializer serializer = new? DataContractJsonSerializer(p.GetType());
string? jsonText;
using? (MemoryStream stream = new? MemoryStream())
{
? ? serializer.WriteObject(stream, p);
? ? jsonText = Encoding.UTF8.GetString(stream.ToArray());
? ? Console.WriteLine(jsonText);
}
using? (MemoryStream ms = new? MemoryStream(Encoding.UTF8.GetBytes(jsonText)))
{
? ? DataContractJsonSerializer serializer1 = new? DataContractJsonSerializer(typeof (Project));
? ? Project p1 = (Project)serializer1.ReadObject(ms);
? ? Console.WriteLine(p1.Input + " => "? + p1.Output);
}
這里要注意,這里的Project類和成員要加相關(guān)的Attribute:
[DataContract]
class? Project
{
? ? [DataMember]
? ? public? string? Input { get ; set ; }
? ? [DataMember]
? ? public? string? Output { get ; set ; }
}