У меня есть строка, содержащая список фруктов. Моя программа C# не может напрямую использовать Fruit, она должна отдать их Банану или Apple. Информация о том, что их использовать, включена в атрибут constructor
в json.Относится к определенному типу в зависимости от атрибута JSON
Примечание: Я использую JSON.NET.
Это то, что я хочу добиться:
class Fruit{ public string constructor;}
class Banana : Fruit { public int monkey;}
class Apple : Fruit { public string shape;}
string json = @"[
{
""constructor"":""banana"",
""monkey"":1
},
{
""constructor"":""apple"",
""shape"":""round""
}]";
List<Fruit> fruitList = JsonConvert.DeserializeObject<List<Fruit>>(json);
List<Banana> bananaList = new List<Banana>();
List<Apple> appleList = new List<Apple>();
foreach(var fruit in fruitList){
if(fruit.constructor == "banana") bananaList.Add((Banana)fruit); //bug
if(fruit.constructor == "apple") appleList.Add((Apple)fruit); //bug
}
//use bananaList and appleList for stuff
Однако, я не могу сделать бросок. Есть ли какой-либо способ, чтобы bananaList содержал все объекты в json, которые имеют атрибуты конструктора, заданные как "banana"
, и то же самое для appleList?
РЕШЕНИЕ:
public static string objToJson(object obj) {
return JsonConvert.SerializeObject(obj, Formatting.Indented, new JsonSerializerSettings {
TypeNameHandling = TypeNameHandling.Auto
});
}
public static T jsonToObj<T>(string str) {
return JsonConvert.DeserializeObject<T>(str, new JsonSerializerSettings {
TypeNameHandling = TypeNameHandling.Auto
});
}
созданных объектов являются фрукты. Класс-cast работает на * актуальном * объекте, поэтому Fruit не может быть «изменен» на Banana/Apple - он действителен только в том направлении. При этом, вероятно, это можно обработать с помощью CustomConverter (у Json.NET есть поддержка для восстановления типов через '$ type'), где такой конвертер будет соответствующим образом анализировать каждый объект в * реальный * экземпляр Banana/Apple. – user2864740
Ого, и посмотрите здесь: http://stackoverflow.com/questions/8030538/how-to-implement-custom-jsonconverter-in-json-net-to-deserialize-a-list-of-base (в первом несколько ударов после поиска «пользовательского конвертера», на самом деле) – user2864740
отстой, вы использовали мой ответ, но приняли другой ответ? –