Silverilght 2でのJSONサポート
Beta 2になってJSONを直接扱うためのクラスが追加されたので、ちょっと触ってみた。
JSON用のクラスは「System.Json」(そのまんまやな)というアセンブリに納められている。
その中には、
- JsonValue
- JsonObject
- JsonArray
- JsonPrimitive
- JsonType(列挙型)
というクラスが定義されている(ヒエラルキーもこの通り)。
使い方はこんな感じ。
Page.xaml.cs
using System; using System.Linq; using System.Json; using System.Windows.Controls; using System.Diagnostics; namespace LinqToJson { public partial class Page : UserControl { public Page() { InitializeComponent(); var jsonString = @"[{ name:'John' }, { name:'Bob' }]"; var json = (JsonArray)JsonValue.Parse(jsonString); var objs = from o in json select new Person { Name = (string)o["name"] }; jsonList.ItemsSource = objs; } } public class Person { public string Name { get; set; } } }
Page.xaml
<UserControl x:Class="LinqToJson.Page" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Grid x:Name="LayoutRoot" Background="White"> <ListBox x:Name="jsonList" Width="200" Height="100"> <ListBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Name}" /> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Grid> </UserControl>
解説
JsonValueクラスのParseメソッドでJSON文字列からJsonValueオブジェクトに変換できる。他にもStreamから読み込むLoadメソッド、StreamにJSON文字列で保存するSaveメソッドなんていうのも用意されている。
JsonValueにはメンバにアクセスするためのインデクサ(this[string])が用意されている。また、JsonObjectを使えばメンバの追加や削除なんかもできる。ちなみにJsonObjectはJavaScriptのオブジェクトと同じように一種のコレクションとして動作する。
JsonArrayはIEnumerableを実装しているので、当然LINQの対象にすることができる。LINQを使えばJSONから.NETオブジェクトへの変換も簡単ですね。
非常にシンプルな機能しか用意されていないけど、普通に使う分には十分だと思う。
個人的にはScriptObjectからJsonValueにいきなりキャストできたら最高だった。自力で作れってことですね、はい。