Десериализовать JSON в анонимный объект - PullRequest
40 голосов
/ 02 августа 2011

В C # я успешно сериализовал анонимный объект в JSON с помощью кода, подобного этому ...

var obj = new { Amount = 108, Message = "Hello" };
JavaScriptSerializer serializer = new JavaScriptSerializer();
String output = serializer.Serialize(obj);

Однако, что я хотел бы сделать позже, это десериализоватьСтрока JSON возвращается в анонимный объект.Примерно так ...

var obj2 = serializer.Deserialize(output, object);

Но для метода serializer.Deserialize () требуется второй параметр - тип объекта, к которому он будет десериализован.

Я пробовал это ...

var obj2 = serializer.Deserialize(output, obj.GetType());

Но это приводит к ошибке:

Не определен конструктор без параметров для типа '<> f__AnonymousType0`2 [[System.Int32, mscorlib, Version = 4.0.0.0, Культура = нейтральный, PublicKeyToken = b77a5c561934e089], [System.String, mscorlib, Версия = 4.0.0.0, Культура = нейтральный, PublicKeyToken = b77a5c561934e089]] '.

Я не уверен, что этоошибка означает.

Ответы [ 5 ]

31 голосов
/ 02 августа 2011

JSON.Net - мощная библиотека для работы с JSON в .Net

. Есть метод DeserializeAnonymousType , к которому можно подключиться, чтобы.

Обновление : Json.Net теперь включен в ASP.Net, однако мой последний любимый вариант - JsonFX .У него также есть отличная поддержка linq, проверьте его.

Обновление 2 : я перешел из JsonFX и сейчас использую ServiceStack.Text , это быстро!

22 голосов
/ 15 октября 2013

Как насчет динамики, самый быстрый способ, который я вижу, это:

dynamic myObject = JsonConvert.DeserializeObject<dynamic>(output);

decimal Amount = Convert.ToDecimal(myObject.Amount);
string Message = myObject.Message;

Примечание: вам понадобится ссылка Newtonsoft.json.dll

14 голосов
/ 02 августа 2011

Как насчет использования метода DeserializeObject , для него не требуется определенный тип. Это также решило аналогичный вопрос SO . Метод десериализуется до Dictionary<string, object>, содержащего пары имя / значение.

Обновление : для уточнения ошибки, которую вы получаете при этом:

var obj2 = serializer.Deserialize(output, obj.GetType());

Учитывая тип obj, Deserialize попытается создать новый экземпляр типа, используя конструктор по умолчанию. У анонимных типов в C # нет открытого конструктора без параметров, и поэтому операция завершается неудачей.

5 голосов
/ 07 сентября 2015

Это также можно сделать с помощью встроенного JavaScriptSerializer следующим образом:

object result = new JavaScriptSerializer().DeserializeObject(JSONData);

Это вернет экземпляр объекта [] с парами ключ-значение.

1 голос
/ 14 мая 2012

Недавно я использовал потрясающую библиотеку JsonFx.Net , и я понял, что она делает. Вы можете использовать Nuget Package Manager, чтобы установить его прямо в Visual Studio.

Код выглядит так,

var reader = new JsonReader();
string input = @"{ ""first"": ""Foo"", ""last"": ""Bar"" }";
var template = new { first=String.Empty, middle=String.Empty, last=String.Empty };
var output = reader.Read(input, template);

Как видите, вы даже можете указать шаблон для анонимного типа.

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