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にいきなりキャストできたら最高だった。自力で作れってことですね、はい。