Json.net сериализовать / десериализовать производные типы?


json.net (newtonsoft)
Я просматриваю документацию, но я не могу найти ничего на этом или лучший способ сделать это.

public class Base
{
    public string Name;
}
public class Derived : Base
{
    public string Something;
}

JsonConvert.Deserialize<List<Base>>(text);

теперь у меня есть производные объекты в сериализованном список. Как десериализовать список и получить обратно производные типы?

2 69

2 ответа:

Если вы храните в вашей text (как и должно быть в этом сценарии), вы можете использовать JsonSerializerSettings.

посмотреть: как десериализовать JSON в IEnumerable с помощью Newtonsoft JSON.NET

будьте осторожны,. Используя что-нибудь кроме TypeNameHandling = TypeNameHandling.None может открыть себя для уязвимость системы безопасности.

вы должны включить обработку имени типа и передать его в сериализатор (de)в качестве параметра настроек.

Base object1 = new Base() { name = "Object1" };
Derived object2 = new Derived() { something = "Some other thing" };
List<Base> inheritanceList = new List<Base>() { object1, object2 };

JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };
string Serialized = JsonConvert.SerializeObject(inheritanceList, settings);
List<Base> deserializedList = JsonConvert.DeserializeObject<List<Base>>(Serialized, settings);

это приведет к правильной дезириализации производных классов. Недостатком этого является то, что он будет называть все объекты, которые вы используете, поэтому он будет называть список, в который вы помещаете объекты.