2013-07-23 8 views
5

Beim Erstellen einer Antwort in WCF (JSON), ich bin ziemlich sicher, dass es nicht möglich ist, vollständig dynamische Objekte zu verwenden, aber wollte nur hier zuerst überprüfen.Dynamische Objekte in WCF nicht möglich?

Eine ideale Antwort würde in etwa so aussehen:

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

In 'kompiliert' Code, der oben könnte durch die folgende Architektur (etwas Pseudo-Code) durchgeführt werden:

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

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

Aber mein Hauptziel ist, dass BartSimpson und LisaSimpson sind nicht "kompiliert", so dass ich eine beliebige Anzahl von Character Klassen haben könnte, mit jeder Name/Identifier in der Antwort.

Antwort

5

Fügen Sie die folgenden using an der Spitze Ihrer Service-Implementierungsklasse (stellen Sie sicher, dass Sie auch die richtigen Referenzen in Ihrem Projekt hinzufügen):

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

Sie können diese einfache Methode versuchen, die das dynamische Ergebnis ausgibt:

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(); 
} 

um einen weiteren Schritt weiter gehen (Sie müssen nur Bart und Lisa in der comaSeparatedNames Wert übergeben), die Sie tun können:

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(); 
} 

Hinweis: Ich habe auch die Zeilen (kommentiert) für die Deserialisierung angegeben.

+1

Edit: Ich nehme an, Sie verwenden 'Newtonsoft.Json' für die Serialisierung. – maxp

+0

Danke für solch ein umfassendes Codebeispiel. Ich arbeite gerade daran. Da mein Rückgabetyp jetzt als "String" definiert ist, scheint meine Antwort alle Werte erhalten zu haben. – maxp

+0

Was meinst du? –

Verwandte Themen