У меня есть простой список ключ / значение в JSON, отправляемый обратно в ASP.NET через POST. Пример:
{ "key1": "value1", "key2": "value2"}
Я не пытаюсь десериализировать в сильно окрашенные объекты .NET
Мне просто нужен старый старый словарь (Of String, String) или какой-то эквивалент (хеш-таблица, Dictionary (Of String, Object), StringDictionary старой школы - черт, мне пригодится двухмерный массив строк.
Я могу использовать все доступные в ASP.NET 3.5, а также популярный Json.NET (который я уже использую для сериализации для клиента).
По-видимому, ни одна из этих библиотек JSON не обладает такой очевидной способностью убивать лоб - они полностью сосредоточены на десериализации, основанной на отражениях, через строгие контракты.
Любые идеи?
Ограничения:
- Я не хочу реализовывать свой собственный анализатор JSON
- Еще не могу использовать ASP.NET 4.0
- Предпочел бы держаться подальше от устаревшего устаревшего класса ASP.NET для JSON
json
asp.net-ajax
asp.net-3.5
json.net
richardtallent
источник
источник
JavaScriptSerizlizer
используется в ASP.NET MVC и больше не рекомендуется.Ответы:
Json.NET делает это ...
Дополнительные примеры: сериализация коллекций с помощью Json.NET
источник
dynamic
в качестве типа значения:JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(json);
[{key: "a", value: "1"}, {key: "b", value:"2"}]
вы должны сделать что-то вроде этого:var dict = JsonConvert.DeserializeObject<List<KeyValuePair<string, string>>>(json);
Я обнаружил, что в .NET есть встроенный способ преобразования строки JSON в тип
Dictionary<String, Object>
viaSystem.Web.Script.Serialization.JavaScriptSerializer
вSystem.Web.Extensions
сборке 3.5 . Используйте методDeserializeObject(String)
.Я наткнулся на это, когда делал пост ajax (через jquery) типа контента 'application / json' для статического .net Page Method и увидел, что метод (у которого был один параметр типа
Object
) волшебным образом получил этот словарь.источник
var jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
затемDictionary<string, object> dict = (Dictionary<string, object>)jsSerializer.DeserializeObject(jsonString);
SomeData: ""
Для тех, кто ищет в интернете и наткнулся на этот пост, я написал пост в блоге о том, как использовать класс JavaScriptSerializer.
Подробнее ... http://procbits.com/2011/04/21/quick-json-serializationdeserialization-in-c/
Вот пример:
источник
Пытался не использовать какую-либо внешнюю реализацию JSON, поэтому я десериализовался следующим образом:
источник
System.Web.Script.Serialization
. Это просто работает. Я даже смог использовать «недопустимый» JSON, какstring json = "{'id':13, 'value': true}";
.У меня была такая же проблема, поэтому я написал это сам. Это решение отличается от других ответов, поскольку оно может десериализоваться на нескольких уровнях.
Просто отправьте строку JSON в функцию deserializeToDictionary, которая вернет не строго типизированный
Dictionary<string, object>
объект.Старый код
Пример: это возвратит
Dictionary<string, object>
объект ответа JSON Facebook.Тестовое задание
Обновить
Мой старый ответ прекрасно работает, если в строке JSON нет массива. Это еще раз десериализовать в,
List<object>
если элемент является массивом.Просто отправьте строку JSON в функцию deserializeToDictionaryOrList, которая будет возвращать не строго типизированный
Dictionary<string, object>
объект илиList<object>
.источник
is
andas
очень помогло мне и упростило мой собственный код.Если вы предпочитаете легкий подход без ссылок, возможно, этот фрагмент кода, который я только что написал, сработает (хотя я не могу на 100% гарантировать надежность).
[Я понимаю, что это нарушает ОП № 1, но технически вы не написали это, я сделал]
источник
System.RunTime.Serialization
это не одна из них, к сожалению, JSON.NET зависит от это и, таким образом, оно также не может быть использовано. Спасибо Dexy за вашу отличную работу, я осмелился немного улучшить ее, чтобы иметь возможность десериализовать массивы массивов, см. Обновленный код в моем ответе здесь .Мне просто нужно было разобрать вложенный словарь, как
где
JsonConvert.DeserializeObject
не помогает Я нашел следующий подход:SelectToken
Позволяет докопаться до нужного поля. Вы даже можете указать путь, подобный"x.y.z"
дальнейшему переходу в объект JSON.источник
System.Text.Json
Теперь это можно сделать с помощью
System.Text.Json
встроенного в.net core 3.0
. Теперь можно десериализовать JSON без использования сторонних библиотек.Также доступно в nu-get пакете System.Text.Json при использовании .Net Standard или .Net Framework.
источник
System.Text.Json
это путь в эти дни.Марк Рендл опубликовал это как комментарий , я хотел опубликовать его как ответ, так как это единственное решение, которое до сих пор работало, чтобы вернуть успех, и коды ошибок json являются результатом ответа Google reCaptcha.
Еще раз спасибо, Марк!
источник
Изменить: это работает, но принятый ответ с использованием Json.NET гораздо проще. Оставьте это на тот случай, если кому-то нужен код только для BCL.
Он не поддерживается платформой .NET из коробки. Яркий недосмотр - не всем нужно десериализовать объекты с именованными свойствами. Итак, я закончил кататься самостоятельно:
Вызывается с:
Извините за смесь C # и VB.NET ...
источник
Я добавил код, представленный здесь jSnake04 и Dasun. Я добавил код для создания списков объектов из
JArray
экземпляров. Он имеет двухстороннюю рекурсию, но, поскольку он функционирует на фиксированной модели с конечным деревом, нет риска переполнения стека, если данные не массивны.источник
Я добавил проверку на нулевые значения в JSON к другому ответу
У меня была такая же проблема, поэтому я написал это сам. Это решение отличается от других ответов, поскольку оно может десериализоваться на нескольких уровнях.
Просто отправьте строку json в функцию deserializeToDictionary, которая будет возвращать не строго типизированный
Dictionary<string, object>
объект.Пример: это возвратит
Dictionary<string, object>
объект ответа JSON Facebook.Примечание: родной город далее десериализуется в
Dictionary<string, object>
объект.источник
d.Value is JObject
. Вам не нужно проходить рефлексию для проверки типов. А сis
оператором вам не нужно проверять на ноль. Возвращает false, если объект нулевой.Кажется, что все эти ответы здесь просто предполагают, что вы можете получить эту маленькую строку из большего объекта ... для людей, которые хотят просто десереализовать большой объект с таким словарем где-то внутри отображения, и кто использует
System.Runtime.Serialization.Json
DataContract, вот решение:Ответ на gis.stackexchange.com содержал эту интересную ссылку . Мне пришлось восстановить его с archive.org, но он предлагает довольно идеальное решение: пользовательский
IDataContractSurrogate
класс, в котором вы реализуете именно свои типы. Я был в состоянии расширить это легко.Я сделал кучу изменений в нем, хотя. Поскольку исходный код больше не доступен, я выложу весь класс здесь:
Чтобы добавить новые поддерживаемые типы в класс, вам просто нужно добавить свой класс, дать ему правильные конструкторы и функции (посмотрите на
SurrogateDictionary
пример), убедиться, что он наследуетсяJsonSurrogateObject
, и добавить его отображение типов вKnownTypes
словарь. Включенный SurrogateDictionary может служить основой для любыхDictionary<String,T>
типов, где T - это любой тип, который правильно десериализуется.Называть это действительно просто:
Обратите внимание, что по какой-то причине у этой вещи есть проблемы с использованием ключевых строк, которые содержат пробелы; их просто не было в окончательном списке. Может быть, это просто против спецификации JSON, и API, который я вызывал, был плохо реализован, заметьте; Я не знаю. В любом случае, я решил эту проблему, заменив их регулярными выражениями на подчеркивания в необработанных данных json и исправив словарь после десериализации.
источник
Dictionary<String,String>
. Честно говоря, я никогда не пытался десериализовать сложные типы с помощью этой системы.Основываясь на комментариях выше, попробуйте
JsonConvert.DeserializeObject<Dictionary<string,dynamic>>(json)
кажется, работает даже для сложных объектов и списков.
источник
Я только что реализовал это в RestSharp . Этот пост был полезен для меня.
Помимо кода в ссылке, здесь мой код. Теперь я получаю
Dictionary
результаты, когда я делаю что-то вроде этого:Помните, какой JSON вы ожидаете - в моем случае я извлекал один объект с несколькими свойствами. В прикрепленной ссылке автор извлекал список.
источник
Мой подход напрямую десериализуется в IDictionary без промежуточных JObject или ExpandObject. В коде используется конвертер, который в основном скопирован из класса ExpandoObjectConverter, находящегося в исходном коде JSON.NET, но с использованием IDictionary вместо ExpandoObject.
Применение:
Код:
источник
Вы могли бы использовать Tiny-JSON
источник
Немного опоздал к игре, но ни одно из вышеперечисленных решений не указало мне путь к чистому и простому решению .NET, а не json.net. Вот и все, в итоге все было очень просто. Ниже приведен полный пример того, как это делается при стандартной сериализации .NET Json, в примере есть словарь как в корневом объекте, так и в дочерних объектах.
Золотая пуля - это кот, проанализируйте настройки как второй параметр для сериализатора:
Полный код ниже:
источник
Достаточно досадно, если вы хотите использовать связующие по умолчанию для моделей, похоже, вам придется использовать числовые значения индекса, такие как форма POST.
Смотрите следующую выдержку из этой статьи http://msdn.microsoft.com/en-us/magazine/hh781022.aspx :
источник
Я хотел бы предложить использовать
System.Runtime.Serialization.Json
это является частью .NET 4.5.Тогда используйте это так:
источник
Для тех, кто пытается конвертировать JSON в словарь только для извлечения некоторого значения из него. есть простой способ использования
Newtongsoft.JSON
источник