Как сериализовать ExpandoObject с помощью ServiceStack JsonSerializer?

Можно ли заставить ServiceStack JsonSerializer сериализовать ExpandoObject как плоский объект, а не как словарь? Что-то примерно такое:

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

Я пытаюсь сравнить JSON-сериализацию ExpandoObject , используя три разные системы: .NET BCL JavaScriptSerializer, Newtonsoft JSON.NET и предложение JSON ServiceStack.

I начните с довольно простого динамического объекта.

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

Сериализатору кажется, что проще обрабатывать ExpandoObject как IDictionary . И 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 был сериализован больше, поскольку он собирается в коде, как если бы типичный класс был сериализован. Вы можете добавить замещающий сериализатор JavaScript в систему BCL для IDictionary . Это отлично работает, если не считать, что у меня есть IDictionary , который должен оставаться таким (чего я пока не делаю).

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)\/"}

6
задан Community 23 May 2017 в 12:19
поделиться