2011-08-21 7 views
6

사전이 아닌 플랫 오브젝트로 ExpandoObject를 직렬화하도록 ServiceStack JsonSerializer를 사용할 수 있습니까? 이 대략 대략 뭔가 : 닷넷 BCL JavaScriptSerializer, Newtonsoft JSON.NET 및 ServiceStack의 JSON 제공 :ServiceStack JsonSerializer를 사용하여 ExpandoObject를 직렬화하는 방법은 무엇입니까?

{"x":"xvalue","y":"\/Date(1313966045485)\/"} 

나는 세 가지 다른 시스템을 사용 ExpandoObject의 JSON 직렬화를 비교하기 위해 노력하고 있습니다.

아주 간단한 동적 객체로 시작합니다.

dynamic test = new ExpandoObject(); 
test.x = "xvalue"; 
test.y = DateTime.Now; 

IT는 IDictionary<string, object> 같은 ExpandoObject을 치료하는 직렬에 대한 간단한 것 같다. BCL과 ServiceStack은 모두 이렇게 다른 경로로 시작하지만 결과는 다릅니다.

JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer(); 
Console.WriteLine(javaScriptSerializer.Serialize(test)); 
// [{"Key":"x","Value":"xvalue"},{"Key":"y","Value":"\/Date(1313966045485)\/"}] 

Console.WriteLine(ServiceStack.Text.JsonSerializer.SerializeToString(test)); 
// ["[x, xvalue]","[y, 8/21/2011 16:59:34 PM]"] 

일반적인 클래스가 직렬화되는 것처럼 코드에서 어셈블되는대로 ExpandoObject를 더 많이 직렬화하는 것을 선호합니다. 당신은 add an override JavaScript serializer to the BCL system for IDictionary<string, object> 일 수 있습니다. 이것은 실제로 작동하지 않아야합니다 (실제로는 아직하지 않습니다.) 그런 식으로 머무를 필요가있는 IDictionary<string, object>을 가지고 있다고 가정하면 위대한 것입니다.

JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer(); 
javaScriptSerializer.RegisterConverters(new JavaScriptConverter[] { new ExpandoJsonConverter() }); 
Console.WriteLine(javaScriptSerializer.Serialize(test)); 
// {"x":"xvalue","y":"\/Date(1313966045485)\/"} 

불행하게도, 나는 아직도 ServiceStack의 JsonSerializer이 같은 방식에 ExpandoObject을 치료하기 위해 얻을 수있는 방법이 필요합니다. 이것을 가능하게하려면 어떻게 ServiceStack 시스템에 연결해야합니까?

업데이트 : 내 용도로 사용할 수있는 옵션은 아니지만 ServiceStack에서 익명 개체를 잘 처리하는 것처럼 보입니다.

Console.WriteLine(ServiceStack.Text.JsonSerializer.SerializeToString(new { x = "xvalue", y = DateTime.Now })); 
// {"x":"xvalue","y":"\/Date(1313980029620+0000)\/"} 

답변

1

이이 동작을 변경하기로 연결할 수 있습니다 ServiceStack의 JsonSerializer에서 사용할 수있는 후크가 아니지만 내가 그것을 수행하는 풀 요청을 받아보다 더 행복 해요;)

클래스 변경할 필요가 있습니다

  • JsWriter.cs (라인 223) -의 expando 개체를 감지하고 당신이 그것을 원하는 방법의 expando 개체를 기록 대리자를 반환하는 코드를 삽입합니다.
  • JsReader (라인 42) -의 expando 개체를 감지하고 문자열의 내용을 읽을 수와의 expando에 다시 역 직렬화하는 대리자를 반환하는 코드를 삽입하는 것은

나는의 expando 개체를 처리하는 코드를 상상 https://groups.google.com/forum/#!forum/servicestack

: 사전 유사하다 그래서 당신은 당신이 (즉, WriteDictionary.csDeserializeDictionary.cs)

이에 더 이상 질문/문제가있는 경우 ServiceStack 포럼을 자유롭게 사용을 안내하는 사전 구현 클래스를 사용할 수 있어야합니다

+0

MonoTouch에서 ServiceStack을 사용하여 다른 시스템에서 생성 된 JSON을 deserialize 할 수 있다면이 특정 문제가 실제로 나를 너무 상처주지는 않습니다. 비록 내가 그것을 해결할 수있다하더라도, 나는 pull 요청을위한 코드를 조합하기 위해 내가 할 수있는 일을 보려고 할 것이다. 현재 프로젝트의 양쪽 끝에서 ServiceStack을 사용하는 것이 좋을 것입니다. – patridge

+1

물론, MonoTouch에서 작동하는 ServiceStack을 얻으려면 https : // github에서 제공되는 MonoTouch 빌드를 사용해야합니다.com/ServiceStack/ServiceStack/tree/master/release/latest/MonoTouch – mythz

+0

정말 쉬웠습니다. 나는 그것을 몇 분 안에 가지고 다녔다. 나가 갈 때 MonoDevelop에있는 키보드 단축키를 재교육하지 않는 경우에 초이었다. – patridge

관련 문제