Перепутанный тем, как использовать JSON в C#

Ответ на примерно каждый вопрос об использовании C# с JSON, кажется, "использование JSON.NET", но это не ответ, который я ищу.

Причина, которую я говорю то есть, от всего, я смог читать в документации, JSON.NET является в основном просто лучшей версией выполнения DataContractSerializer, встроенного в платформу.NET...

Что означает, хочу ли я десериализовать строку JSON, я должен определить полный, класс со строгим контролем типов для КАЖДОГО запроса, который я мог бы иметь. Таким образом, если у меня есть потребность получить категории, сообщения, авторов, теги, и т.д., я должен определить новый класс для каждых из этих вещей.

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

Это - единственный способ, которым это сделано? Разве нет ли способа иметь его, создают своего рода хеш-таблицу, которая может быть считана с json ["propertyname"]?

Наконец, если я действительно должен создать классы сам, что происходит, когда API изменяется, и они не говорят мне (поскольку Твиттер, кажется, известен за то, что сделал)? Я предполагаю, что мой весь проект повредится, пока я не войду и обновляю свойства объектов...

Таким образом, каков точно общий рабочий процесс при работе с JSON? И генералом я имею в виду агностика библиотеки. Я хочу знать, как это сделано в целом, не конкретно к целевой библиотеке...

9
задан Peter Mortensen 8 June 2016 в 09:15
поделиться

2 ответа

Очень трудно быть библиотечно-агностичным, как вы просите, потому что то, как вы работаете с json, действительно зависит от библиотеки, которую вы используете. Например, внутри JSON.NET есть несколько способов работы с JSON. Есть метод, о котором вы говорите, с прямой сериализацией в объекты. Это безопасно с точки зрения типов, но будет нарушено, если данные из вашего API изменятся. Однако есть также LINQ-to-JSON, который предоставляет JObject (который ведет себя довольно похоже на XElement), который предоставляет способ сделать JObject["key"], как вы просили в своем вопросе. Если вы действительно ищете гибкий способ работы с JSON внутри C#, то обратите внимание на JSON.NET's LINQ-to-JSON.

В действительности, независимо от того, как вы это делаете, если API изменится, ваш код, скорее всего, будет сломан. Даже если вы просто используете подход, основанный на хэш-таблицах, ваш код все равно будет сломан, если данные, возвращаемые обратно, изменятся.

Редактировать

Документация JSON.NET

Примеры

Если вы посмотрите примеры, второй из них должен дать вам хороший пример того, как работает LINQ-to-JSON. Он позволяет вам работать с ним без определения каких-либо классов. Все преобразуется в стандартные классы фреймворка (в основном коллекции и строки). Это избавляет от необходимости поддерживать классы.

5
ответ дан 3 November 2019 в 07:12
поделиться

Я был разработчиком Perl более десяти лет и только недавно начал работать с C #. Я удивлен тем, насколько мне это нравится (я вообще не люблю Java), но один из самых сложных когнитивных переключателей - это переход от «Все можно рассматривать как строку, а язык заботится о преобразованиях» на «Pre -Определите свои типы ". В этом случае строковое мышление может быть преимуществом, потому что это то, что вам нужно сделать для того типа API, который вы просите.

Вам нужно написать парсер JSON, который понимает синтаксис , который довольно прост: списки, разделенные запятыми, пары ключ / значение, {} для хэшей / объектов, [] для массивов и цитирование. / экранирование конструкций. Вы захотите создать Hashtable для запуска, потому что сущность верхнего уровня в JSON всегда является объектом, а затем просканируйте строку JSON посимвольно. Вытяните пары ключ / значение; если значение начинается с {, тогда добавьте его как новую хеш-таблицу, если оно начинается с [, добавьте его как новый список ArrayList, в противном случае добавьте его как строку. Если вы получили {или [, вам нужно будет рекурсивно спуститься, чтобы добавить дочерние элементы данных.

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

0
ответ дан 3 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: