2011-02-09 11 views
3

javascriptから返されたJSONを逆シリアル化しようとしています。JSON(ScriptObject)から管理対象オブジェクトへの逆シリアル化

基本的には、クライアント側の私はJSONを返していますし、私のC#のハンドラで、私はスクリプトオブジェクト経由で取得しています...

私は、スクリプトオブジェクト上をConvertTo方法を試してみましたが、まだ何かを得ることができませんでした。

どのように私はScriptObjectをオブジェクトのリストであるC#オブジェクトに変換できますか?

SomeCallBack(ScriptObject result) { 

    // convert to managed object 

    var objects = result.ConvertTo<List<SomeObjectClass>>(); // can't get any property from it.. 

    // however the count is correct... 
    MessageBox.Show("count: " + objects.Count); // shows correct count of items 
} 

答えて

1

SilverlightはScriptObjectを取り、JSON文字列にシリアライズする一切APIが含まれていません。

Silverlightは、System.ServiceModel.Web dllにあるSystem.Runtime.Serialization.Json.DataContractJsonSerializerクラスを使用してJSONのシリアル化をサポートしています。

ScriptObjectの代わりにJSON文字列パラメータを渡すように、渡す値をScriptObjectとして変換するには、JavaScriptベースのJSONシリアライザを取得する必要があります。私はこの仕事のための人気のあるツールがJQueryだと信じています。

x個のアイテムのタイプがSomeObjectClassのセット(「[x1、x2 ,,, xn]」などのJSONなど)が表示されているようです。あなたはこのようなリストをdeserialiseするために、この小さな汎用関数を使用することができます -

List<T> DeserializeJSON<T>(string json) 
    { 

     byte[] array = Encoding.UTF8.GetBytes(json); 
     MemoryStream ms = new MemoryStream(array); 

     DataContractJsonSerializer dcs = new DataContractJsonSerializer(typeof(List<T>)); 
     return (List<T>)dcs.ReadObject(ms); 

    } 

あなたはどうなる: -

var objects = DeserializeJSON<SomeObjectClass>(someJSON); 
1

http://json.codexplex.com/

彼らは、Silverlightのバージョンを持って、Newtonsoft.Jsonのように聞こえます.Linq.JObjectはあなたが後にしているものです。

0

実際のJSONオブジェクトを返す場合、実際にはScriptObject.ConvertToメソッドを使用してJSONオブジェクトをC#オブジェクトに直接的に逆シリアル化できます。たとえば、あなたができる:

JSONオブジェクト

{ id: 0001, 
    name: 'some_name', 
    data: [0.0, 1.0, 0.9, 90.0] } 

C#オブジェクト

using System.Runtime.Serialization; // From the System.Runtime.Serialization assembly 

[DataContract] 
public struct JsonObj 
{ 
    [DataMember] 
    public int id; 

    [DataMember] 
    public string name; 

    [DataMember] 
    public double[] data; 
} 

C#コールバック

public void SomeCallback(ScriptObject rawJsonObj) 
{ 
    // Convert the object 
    JsonObj jsonObj = rawJsonObj.ConvertTo<JsonObj>(); 
} 

しかし、実際のJSONオブジェクトではなく、JSONオブジェクトを表す文字列を返す場合、これは機能しません。代替の逆シリアル化メソッドを使用する必要があります。詳細は、MSDNを参照してください。

これが役に立ちます。

0

JSオブジェクトby C#コードを模倣しています。興味深いことに、オブジェクトリテラルがJS側で使用されることさえ許されていました(Collectionアイテム、オブジェクトリテラルです。いい動き、実際はJSがドライバです)。

SLコード(私は処理のための私のSL成分にJSオブジェクトを渡す):

[ScriptableMember()] 
public string GetValue(ScriptObject o) 
{ 

    Prototype p = (Prototype)o.ConvertTo<Prototype>(); 
    return "A"; 
} 

JS:

control.Content.ExternalName.GetValue({ Collection: [{ a: "A1" }, { a: "A2"}] }) 

C#

public class Prototype 
{ 
    public List<PrototypeItem> Collection 
    { 
    get; 
    set; 
    } 
} 

public class PrototypeItem 
{ 
    public string a 
    { 
    get; 
    set; 
    } 
} 
関連する問題