Десериализовать 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]] '.
Я не уверен, что означает эта ошибка.
Ответы
Ответ 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. Вы обнаружите, что он поддерживает поведение, которое вы ищете, и даже больше!
Ответ 8
Возможно будет достаточно использовать ExpandoObject.
Просто компиляция ответов из десериализации объекта json в динамический объект с использованием Json.net.
var converter = new ExpandoObjectConverter();
var expandoObject = (object)JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);
Ответ 9
В С# нет такой вещи, как "анонимный объект"; чтобы десериализовать, вы должны указать тип десериализации.