Динамически десериализовать 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
        }
}
Другие вопросы по тегам