Десериализовать JSON в динамический c класс - PullRequest
0 голосов
/ 14 июля 2020

Мне нужно десериализовать строку JSON в тип, который не известен во время компиляции. Есть несколько классов, в которые он может быть десериализован. Имя класса предоставляется в качестве входных данных в приложение, и на основе этого я хочу создать экземпляр класса (уже сделал это через отражение):

var type = Type.GetType(className);
var myClassInstance = (IParser)Activator.CreateInstance(type);

... и затем использовать его тип в качестве общего Параметр типа c для JsonConvert.DeserializeObject<typeof(myClassInstance).Name>(jsonString), но это не работает.

Как я могу предоставить класс для DeserializeObject<>() динамически?

Ответы [ 2 ]

3 голосов
/ 14 июля 2020

Вместо использования общей c перегрузки метода, например JsonConvert.DeserializeObject<T>(String) и необходимости прибегать к отражению, как указано в некоторых комментариях, вы можете просто использовать не общий c аналог JsonConvert.DeserializeObject(String, Type), который просто принимает Type экземпляр, как у вас уже есть!

0 голосов
/ 14 июля 2020

Реализация

Инициализация

var class1s = new Class1() {
    ID = 1, Name = "Test", Comment = "This Code is Tested!."
};
var class2s = new Class2() {
    xVal1 = 1, XVal2 = 5, xval3 = 10
};

var JSON1 = Newtonsoft.Json.JsonConvert.SerializeObject(class1s);
var JSON2 = Newtonsoft.Json.JsonConvert.SerializeObject(class2s);

Вызов функций

var classname1 = typeof(Class1).FullName;
var type1 = Type.GetType(classname1);

var classname2 = typeof(Class2).FullName;
var type2 = Type.GetType(classname2);

var c = LocalConverter(JSON1, type1);
var c2 = LocalConverter(JSON2, type2);

Модели классов

public class Class1 {
    public int ID {
        get;
        set;
    }
    public string Name {
        get;
        set;
    }
    public string Comment {
        get;
        set;
    }

}

public class Class2 {
    public int xVal1 {
        get;
        set;
    }
    public int XVal2 {
        get;
        set;
    }
    public int xval3 {
        get;
        set;
    }

}

Требуемый метод

private object LocalConverter(string o, Type xtype) {
    return Newtonsoft.Json.JsonConvert.DeserializeObject(o, xtype);

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