При десериализации JSON из программы на C # мне нужно когда-либо использовать что-либо кроме JavaScriptSerializer? - PullRequest
8 голосов
/ 24 декабря 2010

.NET предоставляет класс JavaScriptSerializer в пространстве имен System.Web.Script.Serialization.(предоставляется в System.Web.Extensions.dll)

Изначально он предназначался для поддержки приложений веб-сервера AJAX, но этот класс может использоваться любым приложением (клиентское, серверное, гибридное и т. д.), которое сериализует и десериализует.NET классы в JSON.У меня есть настольное приложение, которое делает снимки экрана и загружает их на Facebook, и использует этот класс для десериализации ответа.

хотел бы я когда-нибудь искать десериализацию JSON из .NET?

Если так, то почему?и где бы я посмотрел?


Если нет, то почему существует JSON.Net?Это строго для исторических целей?(т. е. потому что он был создан сообществом до JavaScriptSerializer).

Ответы [ 3 ]

1 голос
/ 24 декабря 2010

В моем случае есть различные причины, которые мешают мне использовать JavaScriptSerializer .Вот некоторые из них.

1) Уродливая десериализация при работе с анонимными типами

Хотя использование для сериализации довольно простое:

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
String json = serializer.Serialize(data); 

Однако для десериализации существует небольшое раздражение в том, что десериализатор принимает универсальный тип вместе с содержимым:

serializer.Deserialize<T>(String s) 

это может быть проблемой, если тип T не известен при компиляциивремя и должно быть динамичным.Обходной путь немного уродлив, как я узнал, потому что он использует отражение для создания универсального метода (но он работает)

var result = typeof(JavaScriptSerializer).GetMethod("Deserialize") 
             .MakeGenericMethod(JsonDataType) 
             .Invoke(serializer, new object[] { inputContent }); 

Обратите внимание : согласно комментарию Дэйва Уорда к этому ответу есть DeserializeObject(), который может быть использован для предотвращения этого.

2) Не удается обработать циклические ссылки

Я видел это с использованием Entity Framework , Linq to SQL, NHibernate, NetTiers и даже при использовании Прокси замка .

Согласно MS Connect исключение циклической ссылки будет вызываться, когда навигационное отношение является двусторонним (может иметь доступ к обеим сторонам отношения), поэтому первое, что нужно сделать, это отключить односторона отношения.Исключение также будет выдано, когда вы используете отношения 1: 1 (или 1: 0..1 или любое отношение, вызывающее создание свойства типа EntityReference), в этом случае исключение будет иметь тип System.Data.Metadata.Edm.AssociationType.

Решение этой проблемы - заставить сериализатор игнорировать свойства типа EntityReference, используя пустую реализацию класса, производного от JavaScriptConverter и регистрируя его с помощью метода RegisterConverters объекта JavaScriptSerializer.

3) Полезные функции, которые приводят к менее тестируемому коду

Полезная функция JavaScriptSerializer заключается в том, что вы также можете реализовать пользовательский JavaScriptConverter и передать его JavaScriptSerializer для детального контроля над сериализацией / десериализацией.,Однако, чтобы он был действительно полезным, вам нужно знать типы во время компиляции и иметь ссылки на эти типы.Это действительно ограничивает полезность этой функции, потому что, ссылаясь на эти классы, ваш код становится тесно связанным, поэтому вы не можете легко использовать его в чем-то вроде фильтра MVC.

По этим причинам я часто заканчивал тем, что использовал Json.NET.

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

1 голос
/ 24 декабря 2010

Я использую JavaScriptSerializer в самых разных сценариях, он меня никогда не подводил и никогда не приходилось искать другие решения в других местах ... :)

... но я знаю, что JSON.В net добавлены некоторые значения, такие как LINQ to JSON, которые мне никогда не нужны, и хорошее форматирование JSON, но по мере сериализации JavaScriptSerializer отлично работает.

0 голосов
/ 24 декабря 2010

Я бы не использовал сериализатор, предоставленный .Net. Посмотрите на этот пост, чтобы понять, почему:

http://www.reddit.com/r/linux/comments/epd5z/microsoft_standards_and_incompatibility_19912010/c19v88j

И причина существования JSON.Net в том, что JavaScriptSerializer не появлялся до .Net 3.5. JSON.Net существовал до этого.

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