사전이 아닌 플랫 오브젝트로 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)\/"}
MonoTouch에서 ServiceStack을 사용하여 다른 시스템에서 생성 된 JSON을 deserialize 할 수 있다면이 특정 문제가 실제로 나를 너무 상처주지는 않습니다. 비록 내가 그것을 해결할 수있다하더라도, 나는 pull 요청을위한 코드를 조합하기 위해 내가 할 수있는 일을 보려고 할 것이다. 현재 프로젝트의 양쪽 끝에서 ServiceStack을 사용하는 것이 좋을 것입니다. – patridge
물론, MonoTouch에서 작동하는 ServiceStack을 얻으려면 https : // github에서 제공되는 MonoTouch 빌드를 사용해야합니다.com/ServiceStack/ServiceStack/tree/master/release/latest/MonoTouch – mythz
정말 쉬웠습니다. 나는 그것을 몇 분 안에 가지고 다녔다. 나가 갈 때 MonoDevelop에있는 키보드 단축키를 재교육하지 않는 경우에 초이었다. – patridge