2011-02-24 9 views
1

JSON文字列をパラメータとして受け取るWebサービスがあります。 Webメソッドのパラメータがジェネリック型の 'オブジェクト'である場合にのみ、これを正常に送信できました。このJSONオブジェクトをシリアル化するにはどうすればよいですか?

この汎用オブジェクトを文字列またはカスタムオブジェクトにシリアル化できますか?このメソッドのパラメータ型を変更する必要がありますか?どんな助けも素晴らしいだろう。ここで

は、ウェブメソッドです:

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public string StoreDataOut(object json) 
{ 
    //serialization magic 
} 

これは、このWebメソッドに渡されるテストJSONです:

{ 
    "uid":"1234abcd", 
    "application":"Application Name", 
    "eventName":null, 
    "clienttoken":"Test Client", 
    "version":"1.0.0", 
    "datetime":"1/1/2011 12:00 AM", 
    "data":[ 
     { 
      "id":"alpha_123", 
      "question":"ronunciations in pre-classical times or in non-Attic dialects. For det", 
      "answer":"nunciations " 
     }, 
     { 
     "id":"beta_456", 
     "question":"official documents such as laws an", 
     "answer":"or modif" 
     }, 
     { 
      "id":"gamma_789", 
      "question":" maintained or modified slightly to fit Greek phonology; thus, ?", 
      "answer":"iation of Attic" 
     }, 
     { 
      "id":"delta_098", 
      "question":"econstructed pronunciation of Attic in the late 5th an", 
      "answer":"unciation of " 
     }, 
     { 
      "id":"epsilon_076", 
      "question":"erent stylistic variants, with the descending tail either going straight down o", 
      "answer":"Whole bunch" 
     }, 
     { 
      "id":"zeta_054", 
      "question":"rough breathing when it begins a word. Another diacritic use", 
      "answer":"other dia" 
     } 
    ] 
} 

答えて

2

次のように、クラスが必要とタイプとしてそれを使用しますあなたのウェブメソッドではなく、オブジェクトです。

class JsonDTO 
{ 

    public JsonDTO() 
    { 
    data = new List<data>(); 
    } 
    public string uid {get; set;} 
    public string application {get;set} 
    public string eventName {get; set;} 
    public string clienttoken {get;set} 
    public string version {get;set;} 
    public string @datetime {get; set;} 
    public List<data> data {get; set;} 



} 

public class data 
{ 
    public string id {get; set;} 
    public string question {get; set;} 
    public string answer {get; set;} 
} 
+0

これは機能しますか?クール..病気を試してみてください。 – Nick

+0

これは私に非常に近いです..しかし、リスト "データ"は入力されません – Nick

+0

私は心配していない.. :)おかげで男性..私はasp.netだけのようなプロパティをマップすることは考えていませんでした。 – Nick

2

あなた正しく、.NET Frameworkを持っているあなたのウェブメソッドのシグネチャは次のようになりますので、ほとんどのオブジェクトをシリアル化することができるはずです:私は、特定のオブジェクト、それはprobelmsを持っていることを発見しました

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public string StoreDataOut(MyClass input); 

しかし、と私のフォールバックメソッドは代わりに(シリアル化されたJSONとなる)文字列を受け入れ、JavaScriptSerializerクラスまたはJson.NetのようなJSONシリアル化ライブラリを使用して自分自身を逆シリアル化します。

これは私が私たちのためにdeserialistionを扱うラッパーメソッドで「実際の」方法を分離JavaScriptSerializerクラスを使用してオブジェクトをdeserialisingの例です。

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public string StoreDataOut(string input) 
{ 
    var serialiser = new JavaScriptSerializer(); 
    MyClass deserialisedInput = serialiser.Deserialize<MyClass>(input); 
    return (StoreDataOutImpl deserialisedInput); 
} 

private string StoreDataOutImpl(MyClass input); 

これはあなたの存在の柔軟性を提供しますJavaScriptConvertersを使用してシリアル化を制御することも、完全に異なるライブラリ(たとえばJson.Net)を使用することもできます。

入力するJSONを受け取るために正しくフォーマットされたクラスMyClassが必要です。そうでなければ、シリアル化されたJSONオブジェクトのプロパティに対応するキーと値のペアを含むディクショナリを出力することができます:

関連する問題