2013-07-23 22 views
5

WCF'de (json) bir yanıt oluştururken, tamamen dinamik nesneler kullanmanın mümkün olmadığından eminim, ancak sadece önce burada iki kez kontrol etmek istedim.Dinamik Nesneler mümkün değil mi?

ideal tepki gibi görünecektir: 'derlenen' kodunda

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

, yukarıda aşağıdaki mimarisi (hafifçe yalancı kod) tarafından icra edilebilecek:

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

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

Ama benim asıl hedefi BartSimpson ve LisaSimpson, 'derlenmiş' değil, bu yüzdensınıfında, yanıtta adında/identifer ile herhangi bir sayıya sahip olabilirdim.

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

Dinamik sonucunu çıktı bu basit yöntemi deneyebilirsiniz:

cevap

5

Servis uygulaması sınıfının en üstünde aşağıdaki using ekleyin (ayrıca uygun projenizde başvurular ekleyebilir emin olun):

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

(sadece comaSeparatedNames değerindeki Bart ve Lisa geçmesi gerekecek) bir adım daha ileri gitmek için, yapabileceği:

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

Not: Ayrıca seri hale getirme için satırları (yorum ekledim) sağladım.

+1

Düzenleme: Serileştirme için 'Newtonsoft.Json' kullandığınızı varsayalım. – maxp

+0

Böyle kapsamlı bir kod örneği için teşekkürler. Şu an üzerinde çalışıyorum. Ne yazık ki şimdi benim dönüş türümün bir 'string' olarak tanımlandığından, cevabımın tüm değerleri kaçmış gibi görünüyor? – maxp

+0

Ne demek istiyorsun? –