Как сгладить ExpandoObject, возвращенный через JsonResult в asp.net mvc? - PullRequest
90 голосов
/ 01 марта 2011

Мне действительно нравится ExpandoObject при компиляции динамического объекта на стороне сервера во время выполнения, но у меня возникают проблемы с выравниванием во время сериализации JSON. Сначала я создаю экземпляр объекта:

dynamic expando = new ExpandoObject();
var d = expando as IDictionary<string, object>;
expando.Add("SomeProp", SomeValueOrClass);

Пока все хорошо. В моем контроллере MVC я хочу отправить это как JsonResult, поэтому я делаю это:

return new JsonResult(expando);

Это сериализует JSON в нижеследующее для использования браузером:

[{"Key":"SomeProp", "Value": SomeValueOrClass}]

НО, что я действительно хотел бы увидеть это:

{SomeProp: SomeValueOrClass}

Я знаю, что смогу достичь этого, если использую dynamic вместо ExpandoObject - JsonResult способен сериализовать свойства и значения dynamic в один объект (без использования ключа или значения), но причина, по которой мне нужно использовать ExpandoObject, заключается в том, что я не знаю всех свойств, которые мне нужны для объекта, до времени выполнения , и, насколько я знаю, я не могу динамически добавить свойство в dynamic без использования ExpandoObject.

Возможно, мне придется проанализировать бизнес "Ключ", "Ценность" в моем javascript, но я надеялся выяснить это до отправки его клиенту. Спасибо за вашу помощь!

Ответы [ 12 ]

0 голосов
/ 03 апреля 2012

У меня была такая же проблема, и я понял что-то довольно странное.Если я сделаю:

dynamic x = new ExpandoObject();
x.Prop1 = "xxx";
x.Prop2 = "yyy";
return Json
(
    new
    {
        x.Prop1,
        x.Prop2
    }
);

Это работает, но только если мой метод использует атрибут HttpPost.Если я использую HttpGet, я получаю ошибку.Так что мой ответ работает только на HttpPost.В моем случае это был Ajax Call, поэтому я мог изменить HttpGet на HttpPost.

0 голосов
/ 01 марта 2011

Кажется, что сериализатор приводит Expando к словарю, а затем сериализует его (таким образом, бизнес ключ / значение).Вы пробовали десериализацию как словарь и затем приводили его обратно в Expando?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...