Visual Studio 2011でWindows 8用のMetroアプリケーションを構築しようとしています。それをしようとしている間に、JSON.NET
ライブラリなしでJSON
を解析する方法についていくつかの問題があります(メトロアプリケーションはまだサポートされていません)。
とにかく、私はこれを解析したい:
{
"name":"Prince Charming",
"artist":"Metallica",
"genre":"Rock and Metal",
"album":"Reload",
"album_image":"http:\/\/up203.siz.co.il\/up2\/u2zzzw4mjayz.png",
"link":"http:\/\/f2h.co.il\/7779182246886"
}
.NET 4.5で追加された System.Json Namespace にあるクラスを使用できます。 System.Runtime.Serialization アセンブリへの参照を追加する必要があります
JsonValue.Parse()メソッド はJSONテキストを解析し、 JsonValue を返します:
JsonValue value = JsonValue.Parse(@"{ ""name"":""Prince Charming"", ...");
JSONオブジェクトで文字列を渡す場合、値を JsonObject にキャストできるはずです。
using System.Json;
JsonObject result = value as JsonObject;
Console.WriteLine("Name .... {0}", (string)result["name"]);
Console.WriteLine("Artist .. {0}", (string)result["artist"]);
Console.WriteLine("Genre ... {0}", (string)result["genre"]);
Console.WriteLine("Album ... {0}", (string)result["album"]);
クラスは、 System.Xml.Linq Namespace にあるものと非常に似ています。
私はこれを使用していますが、メトロアプリの開発を行ったことがないため、利用可能なライブラリの制限については知りません。 (注、DataContractおよびDataMember属性を使用してクラスをマークする必要があります)
public static class JSONSerializer<TType> where TType : class
{
/// <summary>
/// Serializes an object to JSON
/// </summary>
public static string Serialize(TType instance)
{
var serializer = new DataContractJsonSerializer(typeof(TType));
using (var stream = new MemoryStream())
{
serializer.WriteObject(stream, instance);
return Encoding.Default.GetString(stream.ToArray());
}
}
/// <summary>
/// DeSerializes an object from JSON
/// </summary>
public static TType DeSerialize(string json)
{
using (var stream = new MemoryStream(Encoding.Default.GetBytes(json)))
{
var serializer = new DataContractJsonSerializer(typeof(TType));
return serializer.ReadObject(stream) as TType;
}
}
}
したがって、このようなクラスがあったら...
[DataContract]
public class MusicInfo
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string Artist { get; set; }
[DataMember]
public string Genre { get; set; }
[DataMember]
public string Album { get; set; }
[DataMember]
public string AlbumImage { get; set; }
[DataMember]
public string Link { get; set; }
}
次に、このように使用します...
var musicInfo = new MusicInfo
{
Name = "Prince Charming",
Artist = "Metallica",
Genre = "Rock and Metal",
Album = "Reload",
AlbumImage = "http://up203.siz.co.il/up2/u2zzzw4mjayz.png",
Link = "http://f2h.co.il/7779182246886"
};
// This will produce a JSON String
var serialized = JSONSerializer<MusicInfo>.Serialize(musicInfo);
// This will produce a copy of the instance you created earlier
var deserialized = JSONSerializer<MusicInfo>.DeSerialize(serialized);
4.5をお持ちでない方のために、jsonを読み取るライブラリ関数を以下に示します。 System.Web.Extensions
へのプロジェクト参照が必要です。
using System.Web.Script.Serialization;
public object DeserializeJson<T>(string Json)
{
JavaScriptSerializer JavaScriptSerializer = new JavaScriptSerializer();
return JavaScriptSerializer.Deserialize<T>(Json);
}
通常、jsonは契約に基づいて書き出されます。その契約は、クラス(T
)に体系化できます。 jsonからWordを取得し、オブジェクトブラウザを検索してそのタイプを見つけることができます。
使用例:
JSONを考える
{"logEntries":[],"value":"My Code","text":"My Text","enabled":true,"checkedIndices":[],"checkedItemsTextOverflows":false}
次のようなRadComboBoxClientState
オブジェクトに解析できます。
string ClientStateJson = Page.Request.Form("ReportGrid1_cboReportType_ClientState");
RadComboBoxClientState RadComboBoxClientState = DeserializeJson<RadComboBoxClientState>(ClientStateJson);
return RadComboBoxClientState.Value;
JavaScriptSerializer
を使用してみましたか? DataContractJsonSerializer
もあります
DataContractJsonSerializer
を使用できます。詳細については、こちらをご覧ください link .
Tiferix.Jsonと呼ばれる.NETライブラリをリリースしました。これにより、JsonファイルをADO.Net DataSetおよびDataTableオブジェクトとの間でシリアライズおよびデシリアライズできます。このプロジェクトは進行中の作業であり、今後6か月以内に(できれば)動的クラスや匿名型を含むさまざまなタイプの.Netクラスおよびオブジェクトのシリアル化を可能にする機能を拡張します。現在のところ、Tiferix.Jsonライブラリには生のJsonDataReaderはありませんが、.NET BinaryまたはStreamWriterと同じタイプの方法でJsonファイルを書き込むことができるかなり強力なJsonDataWriterクラスがあります。 Tiferix.JsonライブラリのJsonDataWriterには、Jsonファイルを自動識別する機能もあります。これは、Json.Netを含む他のJsonライブラリにはない非常に便利な機能です。
興味がある場合は、GithubページでTiferix.Jsonプロジェクトを表示し、ライブラリとdllをダウンロードできます。 Tiferix.Jsonは、より包括的なJson.Netライブラリよりもはるかにシンプルで軽量な代替手段を提供し、ネイティブの.Net Jsonクラスよりも剛性が低く、使いやすい(私の意見では)です。