Уменьшение количества байтов сообщений JsonResult в ASP.NET MVC

Результаты действий, закодированные с использованием JsonResult, кажутся излишне подробными в их сериализации. Например:

{"foo":"bar","list":["a","b"],"map":{"a":1,"b":2,"c":3}}

JavaScript, кажется, вполне доволен этой более короткой версией в качестве эквивалента:

{foo:"bar",list:["a","b"],map:{a:1,b:2,c:3}}

Итак, это двоякий вопрос:

  1. Есть ли причина, по которой первое лучше, если все мои ярлыки являются действительными идентификаторами JavaScript?
  2. Могу ли я заставить платформу ASP.NET MVC кодировать мои сообщения с использованием этого более короткого синтаксиса?

Я пишу довольно тяжелое приложение с AJAX и подсчитал, что я бы сэкономил от 15% до 20% на размере сообщения. Во многих случаях разница между помещением ответа в один пакет TCP или нет. Даже если не брать во внимание производительность, такое сокращение моего ежемесячного счета за пропускную способность было бы благом.

ИЗМЕНИТЬ

Как указывает Джастин, кавычки необходимы в соответствии со стандартом JSON, но мне они не нужны в браузере для использования на чистом JavaScript. Могу ли я заставить веб-фреймворк .NET отбрасывать кавычки каким-либо способом, который проще, чем писать собственный сериализатор JSON?


person Drew Noakes    schedule 09.11.2010    source источник
comment
Кавычки необходимы при отправке данных в службу ASMX и WCF, и вы даже не можете заменить их одинарными кавычками, иначе вы увидите исключение, созданное службой. Я не могу найти ни одного стандарта JSON, в котором говорится, что кавычки необходимы, по крайней мере, для Javascript.   -  person tshao    schedule 09.11.2010
comment
В ваших расчетах учитывается сжатие http-потока? Я не уверен, что вы действительно сэкономите 15-20%, но это всего лишь догадка.   -  person Ryan    schedule 09.11.2010
comment
@ Райан. Хороший момент, но если мои сообщения маленькие (1,5 КБ), сжатие может действительно увеличить их размер. Я обязательно рассмотрю это как вариант, ура.   -  person Drew Noakes    schedule 09.11.2010


Ответы (2)


Еще одна ветка говорила о цитатах:

синтаксис JSON для имен свойств

Основная суть в том, что отсутствие кавычек квалифицируется как действительный javascript, но НЕ как действительный JSON.


Что касается изменения вашего JSON, чтобы не включать кавычки для свойств - я не уверен, что это отличная идея. Если вы решите открыть свои JSON-вызовы для внешнего API, кто знает, что может пойти не так с недопустимым форматом.

Но если вы хотите продолжить здесь, я думаю, что лучше всего загрузить и изменить библиотеку с открытым исходным кодом JSON.NET:

http://json.codeplex.com/

В их документации есть специальная статья об уменьшении размера JSON, хотя в них не упоминается удаление кавычек:

http://james.newtonking.com/projects/json/help/ReducingSerializedJSONSize.html

После загрузки этого кода и изменения класса JSONTextWriter вы можете создать собственный ActionResult в MVC, который использует этот сериализатор вместо класса System.Web.Script.Serialization.JavaScriptSerializer, который используется по умолчанию в классе JsonResult. Есть несколько отличных примеров того, как это сделать с другими типами данных в проекте MVC Contrib:

http://mvccontrib.codeplex.com/

Надеюсь это поможет.

person Justin Beckwith    schedule 09.11.2010
comment
Спасибо за ссылки. Теперь, что касается второй части (и настоящей сути) вопроса, могу ли я заставить веб-фреймворк .NET отбрасывать кавычки каким-то образом, который проще, чем писать свой собственный сериализатор JSON? - person Drew Noakes; 09.11.2010

При -30: 20 в видео «JavaScript - хорошие моменты», Дуглас Крокфорд отмечает, что первое в истории сообщение JSON, которое было отправлено между клиентом и сервером, не удалось, потому что одно из имен полей, которые они использовали, было «do», что является зарезервированным словом в JavaScript. Он объясняет, что так быть не должно (интерпретатор может различать в зависимости от контекста), но это одна из многих причуд, которые ускользнули из поспешно разработанного языка в стандарт.

Следовательно, имена полей должны заключаться в кавычки. Конечно, должна быть возможность вести список зарезервированных терминов и заключать только те, которые находятся в кавычках.

person Drew Noakes    schedule 24.11.2010