C葃解析JSONフォーマットデータ

6068 ワード

JSON概要
JSON(全部JavaScript Object Notationという)は、軽量級のデータ交換フォーマットです.それはJavaScript文法標準に基づくサブセットです.JSONは言語とは完全に独立したテキスト形式を採用しており、様々なネットワーク、プラットフォーム、プログラム間で容易に伝送できます.JSONの文法はとても簡単で、人に読みやすくて、編纂しやすくて、同時に機械の解析と生成も簡単です.
 
JSONとXMLの比較
◆可読性
JSONとXMLの可読性を比較すると、XMLは補助的なラベルを提供しているので、人が読んで理解するのにもっと適しています.
◆ファイルサイズと転送
XMLは便利なラベルを使用できるので、ファイルサイズはJSONより大きいです.またJSONはJavascriptから源を発していますので、生まれつきの主戦場はJavascriptとネットです.ここでJSONはXMLに追いつけない優勢を持っています.
 
JSON文法
1.JSON文法はJavaScriptの対象がフランス語法を表すサブセットです.
データは名前/値ペアにあります.名前は文字列で、二重引用符で表します.値は、数字(整数または浮動小数点)、文字列(二重引用符)、配列(四角い括弧内)、オブジェクト(括弧内)、true/false/nullとすることができます.
データはコンマで区切られています.
かっこでオブジェクトを保存します.オブジェクトは、配列を含むさまざまなデータを含んでいます.
大かっこ保存配列:数字はオブジェクトを含むことができます.
たとえば:
{
   "students": [
       {
           "name": "coolszy",
           "age": 24
       },
       {
           "name": "kuka",
           "age": 24
       }
    ]
}
2.JSONに変換文字が含まれている場合は、変換が必要です.
 
C葃操作JSON
JSONファイルをメモリに読み込むと文字列になります.NET操作JSONはJSON文字列を生成して解析します.JSONを操作するには、通常以下のような方法があります.
1.元の方式
自分はJSONの文法形式に従って、コードを書いて直接JSON文字列を操作します.必要でなければ、この道を歩いて、初めからやり直す人は少ないはずです.
 
2.共通方式
この方式はオープンソースのNewtonift.Jsonを使っています.http://json.codeplex.com/を選択します.ダウンロードしてプロジェクトに参加すれば使えます.通常はJObject、Json Reader、Json Writerで処理できます.このような方法は最も通用して、最も柔軟で、いつでも不快なところを修正できます.
(1)Json Readerを使ってJson文字列を読む:
string jsonText =@"{""input"" : ""value"",""output"" : ""result""}";
JsonReader reader = new JsonTextReader(newStringReader(jsonText));
while (reader.Read())
{
   Console.WriteLine(reader.TokenType + "\t\t" + reader.ValueType+ "\t\t" + reader.Value);
}
(2)JsoWriter文字列を使用する:
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)Json Serializerを使って相手を読みます.
行列型データ
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 p = new Project() { Input ="stone", Output = "gold" };
JsonSerializer serializer = newJsonSerializer();
StringWriter sw = new StringWriter();
serializer.Serialize(newJsonTextWriter(sw), p);
Console.WriteLine(sw.GetStringBuilder().ToString());
 
StringReader sr = newStringReader(@"{""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; }
}
また、上のJson TextReaderなどのコンパイルが越えないなら、私達自身が修正したクラスだと説明して、あなた達自身の関連カテゴリに変えてもいいです.使用に影響はありません.
 
3.内蔵方式
使用.NET Fraamewark 3.5/4.0で提供されるSystem.Web.Script.Serialization名前空間におけるJavaScript Serializer類は対象の序列化と逆順序化を行い、直接的である.
 
 Project p = new Project() { Input ="stone", Output = "gold" };
 JavaScriptSerializer serializer = newJavaScriptSerializer();
 varjson = serializer.Serialize(p);
 Console.WriteLine(json);
 
 varp1 = serializer.Deserialize<Project>(json);
 Console.WriteLine(p1.Input+ "=>" + p1.Output);
 Console.WriteLine(ReferenceEquals(p,p1));
注意:VSL 2010を使用すると、現在のプロジェクトのTarget Fraamewarkが変更されます.Net Frame ework 4は、Client Profileを使用することができません.もちろんこのSystem.Web.Extensions.dllは主にWebで使われています.直接Consolieプロジェクトで使うのはちょっともったいないです.
また、最後の文からも分かるように、プログレッシブと逆プログレッシブは、深くコピーされた典型的な実現方法である.
 
4.契約方式
System.Runtime.Serialzation.dllで提供するData ContractJson SerializerまたはJson ReaderWriter Factoryを使って実現します.
 
Project p = new Project() { Input ="stone", Output = "gold" };
DataContractJsonSerializer serializer = newDataContractJsonSerializer(p.GetType());
string jsonText;
 
using (MemoryStream stream = newMemoryStream())
{
   serializer.WriteObject(stream, p);
   jsonText = Encoding.UTF8.GetString(stream.ToArray());
    Console.WriteLine(jsonText);
}
 
using (MemoryStream ms = newMemoryStream(Encoding.UTF8.GetBytes(jsonText)))
{
   DataContractJsonSerializer serializer1 = newDataContractJsonSerializer(typeof(Project));
   Project p1 = (Project)serializer1.ReadObject(ms);
   Console.WriteLine(p1.Input + "=>" + p1.Output);
}
ここのProject類とメンバーはAttributeを追加します.
 
[DataContract]
class Project
{
   [DataMember]
   public string Input { get; set; }
   [DataMember]
   public string Output { get; set; }
}
 
実用参考:
JSON検証ツール:http://jsonlint.com/
JSON簡明教程:http://www.w3school.com.cn/json/
Newtonift.Jsonクラスライブラリのダウンロード:http://json.codeplex.com/