Подтвердить что ты не робот

Десериализовать JSON в анонимный объект

В С# я успешно сериализую анонимный объект в 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, Culture = neutral, PublicKeyToken = b77a5c561934e089], [System.String, mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]] '.

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

4b9b3361

Ответ 1

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

Есть метод DeserializeAnonymousType, на который вы можете нажать.

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Обновить: чтобы прояснить ошибку, возникающую при этом:

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

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

Ответ 4

Создайте именованный тип, представляющий то, что вы ожидаете от объекта.

class DataTransferObject
{
  int Amount { get; set; }
  string Message { get; set; }
}

Затем вы можете сделать это:

var obj2 = serializer.Deserialize<DataTransferObject>(output);

Ответ 5

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

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

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

Ответ 6

Недавно я использовал потрясающую библиотеку 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);

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

Ответ 7

Я знаю, что технически не отвечаю на ваш прямой вопрос, но посмотрю Json.net. Вы обнаружите, что он поддерживает поведение, которое вы ищете, и даже больше!

Ответ 9

В С# нет такой вещи, как "анонимный объект"; чтобы десериализовать, вы должны указать тип десериализации.