2013-07-23 10 views
5

Podczas budowania odpowiedzi w WCF (json), jestem pewien, że nie można używać obiektów całkowicie dynamicznych, ale chciałem najpierw dwukrotnie sprawdzić tutaj.Dynamiczne obiekty w WCF nie są możliwe?

Idealną odpowiedzią będzie wyglądać następująco:

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

w „skompilowany” kodzie powyżej można przeprowadzić według następującego architektury (nieco pseudokod):

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

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

ale mój główny cel jest to, że BartSimpson i LisaSimpson nie są "kompilowane", więc mógłbym mieć dowolną liczbę klas Character, z dowolną nazwą/identyfikatorem w odpowiedzi.

Odpowiedz

5

Dodaj następujący using na szczycie swojej klasy realizacji usług (upewnij się, że można również dodać odpowiednie odniesienia w projekcie):

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

Możesz spróbować tej prostej metody, która wyprowadza dynamiczny rezultat:

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

pójść o krok dalej (będziesz tylko musiał przejść Bart i Lisa wartości comaSeparatedNames), można zrobić:

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

Uwaga: Podałem również linie (skomentowane) do deserializacji.

+1

Edycja: Zakładam, że używasz 'Newtonsoft.Json' do serializacji. – maxp

+0

Dzięki za tak kompleksowy przykład kodu. Obecnie pracuję nad tym. Niestety teraz, gdy mój typ zwracany jest zdefiniowany jako 'ciąg', moja odpowiedź wydaje się mieć wszystkie wartości uniknięte? – maxp

+0

Co masz na myśli? –

Powiązane problemy