2013-07-23 3 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 클래스를 얼마든지 가질 수 있습니다. 이름/식별자가 응답에 포함되어 있습니다.

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

당신은 동적 결과를 출력이 간단한 방법을 시도 할 수 있습니다 :

답변

5

서비스 구현 클래스의 맨 위에 다음 using 추가 (당신은 또한 적절한 프로젝트에 참조를 추가해야합니다) :

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

무엇을 의미합니까? –

관련 문제