Ответ на примерно каждый вопрос об использовании C# с JSON, кажется, "использование JSON.NET", но это не ответ, который я ищу.
Причина, которую я говорю то есть, от всего, я смог читать в документации, JSON.NET является в основном просто лучшей версией выполнения DataContractSerializer, встроенного в платформу.NET...
Что означает, хочу ли я десериализовать строку JSON, я должен определить полный, класс со строгим контролем типов для КАЖДОГО запроса, который я мог бы иметь. Таким образом, если у меня есть потребность получить категории, сообщения, авторов, теги, и т.д., я должен определить новый класс для каждых из этих вещей.
Это прекрасно, если я создал клиент, и знайте точно, каковы поля, но я использую чужой API, таким образом, я понятия не имею, что - контракт то, если я не загружаю демонстрационную строку ответа и создаю класс вручную из строки JSON.
Это - единственный способ, которым это сделано? Разве нет ли способа иметь его, создают своего рода хеш-таблицу, которая может быть считана с json ["propertyname"]?
Наконец, если я действительно должен создать классы сам, что происходит, когда API изменяется, и они не говорят мне (поскольку Твиттер, кажется, известен за то, что сделал)? Я предполагаю, что мой весь проект повредится, пока я не войду и обновляю свойства объектов...
Таким образом, каков точно общий рабочий процесс при работе с JSON? И генералом я имею в виду агностика библиотеки. Я хочу знать, как это сделано в целом, не конкретно к целевой библиотеке...
Очень трудно быть библиотечно-агностичным, как вы просите, потому что то, как вы работаете с json, действительно зависит от библиотеки, которую вы используете. Например, внутри JSON.NET есть несколько способов работы с JSON. Есть метод, о котором вы говорите, с прямой сериализацией в объекты. Это безопасно с точки зрения типов, но будет нарушено, если данные из вашего API изменятся. Однако есть также LINQ-to-JSON, который предоставляет JObject (который ведет себя довольно похоже на XElement), который предоставляет способ сделать JObject["key"], как вы просили в своем вопросе. Если вы действительно ищете гибкий способ работы с JSON внутри C#, то обратите внимание на JSON.NET's LINQ-to-JSON.
В действительности, независимо от того, как вы это делаете, если API изменится, ваш код, скорее всего, будет сломан. Даже если вы просто используете подход, основанный на хэш-таблицах, ваш код все равно будет сломан, если данные, возвращаемые обратно, изменятся.
Редактировать
Если вы посмотрите примеры, второй из них должен дать вам хороший пример того, как работает LINQ-to-JSON. Он позволяет вам работать с ним без определения каких-либо классов. Все преобразуется в стандартные классы фреймворка (в основном коллекции и строки). Это избавляет от необходимости поддерживать классы.
Я был разработчиком Perl более десяти лет и только недавно начал работать с C #. Я удивлен тем, насколько мне это нравится (я вообще не люблю Java), но один из самых сложных когнитивных переключателей - это переход от «Все можно рассматривать как строку, а язык заботится о преобразованиях» на «Pre -Определите свои типы ". В этом случае строковое мышление может быть преимуществом, потому что это то, что вам нужно сделать для того типа API, который вы просите.
Вам нужно написать парсер JSON, который понимает синтаксис , который довольно прост: списки, разделенные запятыми, пары ключ / значение, {} для хэшей / объектов, [] для массивов и цитирование. / экранирование конструкций. Вы захотите создать Hashtable для запуска, потому что сущность верхнего уровня в JSON всегда является объектом, а затем просканируйте строку JSON посимвольно. Вытяните пары ключ / значение; если значение начинается с {, тогда добавьте его как новую хеш-таблицу, если оно начинается с [, добавьте его как новый список ArrayList, в противном случае добавьте его как строку. Если вы получили {или [, вам нужно будет рекурсивно спуститься, чтобы добавить дочерние элементы данных.
Если в .NET есть хороший синтаксический анализатор рекурсивного спуска, вы, вероятно, могли бы использовать его, чтобы упростить или повысить надежность работы, но JSON достаточно прост, чтобы сделать это хорошее и достаточно выполнимое упражнение.