2013-07-23 2 views
5

При построении ответа в WCF (json), im довольно уверен, что невозможно использовать полностью динамические объекты, но сначала нужно сначала проверить его.Динамические объекты в 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;} 
} 

Но моя главная цель что BartSimpson и LisaSimpson не «скомпилированы», поэтому я мог бы иметь любое количество классов 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

Спасибо за такой полный пример кода. В настоящее время я работаю над этим. К сожалению, теперь, когда мой тип возвращаемого значения определяется как «строка», мой ответ, похоже, имеет все значения, которые удалось избежать? – maxp

+0

Что это значит? –

Смежные вопросы