NewtonSoft DeserializeObject <Список <typename>>. Какие типы серверов отправляет я не знаю - PullRequest
0 голосов
/ 13 мая 2019

У меня похожий вопрос.

десериализация списка объектов с использованием json.net

Обычно мы делаем, как показано ниже, для десериализации списка объектов.Но в моем случае я не могу жестко кодировать List<Category>, так как я не знаю, какой будет тип.

JsonConvert.DeserializeObject<List<Category>>(response.dtosString)

В json будет свойство, которое даст мне имя типа, с помощью которого я смогу создать тип, как показано ниже

string typename = string.Format("{0}, ABC.EDF", myresponse.dtoType);
Type resultType = Type.GetType(typename);

Теперь я хочу использовать что-то вроде ниже

JsonConvert.DeserializeObject<List<typename>>(myresponse.dtosString)

Я попробовал ниже, но не работает, так как он говорит, что динамическое не может быть преобразовано и нуждается в явной логике преобразования.

Десериализация неизвестного типа в JSON.NET

РЕШЕНИЕ: Спасибо Крису за то, что он указал мне правильное направление.

Это то, что я сделал

string typename = string.Format("{0}, ABC.EDF", myresponse.dtoType);
Type resultType = Type.GetType(typename);
var listType = typeof(List<>);
Type constructedListType = listType.MakeGenericType(resultType);
var myData = Newtonsoft.Json.JsonConvert.DeserializeObject(myresponse.dtosString, constructedListType); 

После этого я просто предоставляю myData для функции чтения, котораянаходится в сторонней библиотеке, к которой у меня нет доступа, и которая обрабатывает данные.

1 Ответ

1 голос
/ 13 мая 2019

Существует перегрузка, которая принимает объект Type.Чтобы создать список вашего типа, вам нужно сделать что-то вроде этого:

var constructedListType = typeof(List<>).MakeGenericType(resultType);
var listType = Activator.CreateInstance(constructedListType);

Тогда вам просто нужно использовать соответствующую перегрузку десериализации:

var myList = JsonConvert.DeserializeObject(myresponse.dtosString, listType);

Стоит отметитьчто myList будет иметь тип Object, и не существует простого способа строго его ввести.В зависимости от того, что вам нужно с этим делать, это может быть нормально, или вам может понадобиться использовать dynamic, чтобы позволить вам использовать его дальше по линии.

...