Я пишу ApiController веб-API с несколькими методами PUT, которые получают данные JSON. JSON не является детерминированным и, следовательно, не может быть жестко сопоставлен с пользовательским объектом C#, но должен быть получен в виде словарей/последовательностей (карт/списков).
Я попытался использовать IDictionary для параметра данных метода PUT в контроллере, и это работает - данные отображаются из JSON в словарь. Однако необходимо объявить словарь как <String,Object>
, и нет четкого способа получить значения Object как их соответствующие типы. (В ходе поиска я нашел несколько предложенных клугов, но это именно так.)
Существует также тип System.Json.JsonObject, который мне, наконец, удалось загрузить через NuGet, но когда я его использую, система, похоже, не знает, как сопоставлять данные.
Как это обычно делается? Как вы реализуете метод ApiController, который получает универсальный JSON?
Я вижу три основных подхода:
- Каким-то образом заставить Dictionary/Sequence работать с Object или чем-то подобным.
- Заставьте что-то вроде System.Json.JsonObject работать, возможно, прокручивая информацию о маршрутизации.
- Получите JSON в виде массива байтов, а затем выполните явный синтаксический анализ с помощью одного из доступных инструментов C# JSON.
(Что касается того, насколько динамичны данные, объекты JSON могут иметь отсутствующие записи или посторонние записи, а в некоторых случаях конкретная запись может быть представлена либо как одно значение JSON, либо как массив значений JSON. (Где «значение» — это массив JSON. , объект, строка, число, логическое значение или нуль.) В общем, за исключением неоднозначности массив/не массив, отношение между ключами и типами значений известно.)
(Но я должен отметить, что это большой проект, и я буду получать строки JSON от нескольких других компонентов других авторов. Возможность проверить полученный тип и подтвердить, что он соответствует ожиданиям, была бы весьма полезна и, возможно, даже необходима. с точки зрения безопасности.)
(Должен добавить, что я относительный новичок в C# — работаю с ним всего около 6 месяцев.)
dynamic
вы получаете JSON? Знаете ли вы заранее, какие поля он может содержать? - person Yuval Itzchakov   schedule 04.06.2014