Динамически десериализовать JSON в любой переданный объект. C#
Я пытаюсь сделать, это десериализовать JSON в объект в C#. То, что я хочу сделать, это передать любой объект, получить его тип и десериализовать json в этот конкретный объект с помощью библиотеки JSON.Net. Вот строки кода.
Object someObject1 = someObject;
string result = await content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<someObject1.GetType()>(result);
Последняя строка выдает исключение
operator '<' cannot be applied to operands of type 'method group'
Как я могу получить тип данных в <> без C# жаловаться. Что мне нужно сделать, чтобы этот код работал? И какие знания мне не хватает?
3 ответа
JsonConvert.DeserializeObject<T>
нужен тип времени компиляции. Вы не можете передать его тип во время выполнения, как вы хотите сделать в вопросе (ничто иное, как объявление List<T>
). Вы должны либо десериализовать в общий объект JSON JObject
(или динамический), или вы должны создать экземпляр объекта и заполнить его с помощью json.
Вы можете использовать статический метод PopulateObject
(конечно, если свойства вашего объекта соответствуют json, который вы хотите десериализовать).
JsonConvert.PopulateObject(result, someObject1 );
Вы можете игнорировать общий метод и использовать dynamic
:
var myObj = (dynamic)JsonConvert.DeserializeObject(result);
Однако, если объекты не одного типа, вам будет сложно различать типы и, возможно, попадать в ошибки времени выполнения.
Для тех, кто сталкивается с этой проблемой, более новые версии Newtonsoft JSON имеют перегрузку, которая принимает тип в качестве второго аргумента и где вы можете передавать динамическое значение, не прыгая через какие-либо обручи:
var myObj = JsonConvert.DeserializeObject(string serializedObject, Type deserializedType);
Это лучший способ заполнить поля объекта данными JSON.
Этот код принадлежит самому объекту как метод.
public void PopulateFields(string jsonData)
{
var jsonGraph = JObject.Parse(jsonData);
foreach (var prop in this.GetType().GetProperties())
{
try
{
prop.SetValue(this, fields[prop.Name].ToObject(prop.PropertyType), null);
}
catch (Exception e)
{
// deal with the fact that the given
// json does not contain that property
}
}