2013-07-23 7 views
5

WCF(json)でレスポンスを作成するときは、完全に動的なオブジェクトを使用することはできませんが、ここで最初に確認したいだけです。上記次のアーキテクチャ(やや擬似コード)によって実行することができ、「コンパイル」コードでWCFの動的オブジェクトは使用できませんか?

"userTypes" : 
        { 
         "BartSimpson" : 
          { 
           "url" : "foo", 
           "desc" : "bar" 
          }, 
         "LisaSimpson" : 
          { 
           "url" : "foo", 
           "desc" : "bar" 
          } 
        } 

public class Character{ 
string url {get;set;} 
string desc{get;set;} 
} 

public class UserTypes{ 
public Character BartSimpson{get;set;} 
public Character LisaSimpson{get;set;} 
} 

しかし、私の主な目標

理想的な応答は次のようになりますBartSimpsonLisaSimpsonは「コンパイルされていない」ので、Characterクラスの任意の数を持つことができます。名前/識別子が応答に含まれています。

答えて

5

(また、あなたのプロジェクトに適切な参照を追加していることを確認してください)あなたのサービス実装クラスの先頭に次のusingを追加します。

using Newtonsoft.Json; 
using System.Dynamic; 
using System.IO; 
using System.Text; 

あなたはダイナミックな結果を出力し、この簡単な方法を試してください:

public string GetData() 
{ 
    dynamic d = new ExpandoObject(); 
    dynamic bartSimpson = new ExpandoObject(); 
    dynamic lisaSimpson = new ExpandoObject(); 
    bartSimpson.url = "foo"; 
    bartSimpson.desc = "bar"; 
    lisaSimpson.url = "foo"; 
    lisaSimpson.desc = "bar"; 
    d.userTypes = new ExpandoObject(); 
    d.userTypes.BartSimpson = bartSimpson; 
    d.userTypes.LisaSimpson = lisaSimpson; 
    var s = JsonSerializer.Create(); 
    var sb = new StringBuilder(); 
    using (var sw = new StringWriter(sb)) 
    { 
     s.Serialize(sw, d); 
    } 
    return sb.ToString(); 
} 

(あなただけcomaSeparatedNames値でバートとリサに合格する必要があります)もう一歩進んために、あなたができる:

public string GetData(string comaSeparatedNames) 
{ 
    string[] names = comaSeparatedNames.Split(','); 
    dynamic d = new ExpandoObject(); 
    dynamic dNames = new ExpandoObject(); 
    foreach (var name in names) 
    { 
     dynamic properties = new ExpandoObject(); 
     properties.url = "foo"; 
     properties.desc = "bar"; 
     ((IDictionary<string, object>)dNames).Add(name, properties); 
    } 
    ((IDictionary<string, object>)d).Add("userTypes", dNames); 

    var s = JsonSerializer.Create(); 
    var sb = new StringBuilder(); 
    using (var sw = new StringWriter(sb)) 
    { 
     s.Serialize(sw, d); 
    } 

    // deserializing sample 
    //dynamic dummy = new ExpandoObject(); 
    //var instance = s.Deserialize(new StringReader(sb.ToString()), 
    // dummy.GetType()); 
    //var foo = instance.userTypes.BartSimpson.url; 

    return sb.ToString(); 
} 

注:デシリアライズのための行(コメント付き)も提供しています。

+1

編集:私は、あなたが 'Newtonsoft.Json'を直列化に使用していると仮定します。 – maxp

+0

このような包括的なコード例をありがとう。私は現在それを介して作業しています。残念ながら、戻り値の型が 'string'として定義されたので、私の応答はすべての値をエスケープしているようです。 – maxp

+0

どういう意味ですか? –

関連する問題