Json.net은 파생 유형을 직렬화 / 역 직렬화합니까?
json.net (newtonsoft)
문서를 살펴보고 있지만 이것에 대한 내용이나 최선의 방법을 찾을 수 없습니다.
public class Base
{
public string Name;
}
public class Derived : Base
{
public string Something;
}
JsonConvert.Deserialize<List<Base>>(text);
이제 직렬화 된 목록에 Derived 개체가 있습니다. 목록을 역 직렬화하고 파생 된 형식을 다시 가져 오는 방법은 무엇입니까?
text
이 시나리오에 있어야하는 것처럼 유형을 저장하는 경우 JsonSerializerSettings
.
참조 : Newtonsoft JSON.NET을 사용하여 JSON을 IEnumerable <BaseType>으로 역 직렬화하는 방법
하지만 조심하세요. 다른 것을 사용 하면 보안 취약점에 노출TypeNameHandling = TypeNameHandling.None
될 수 있습니다 .
유형 이름 처리를 활성화하고 설정 매개 변수로 직렬화 해제에 전달해야합니다.
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);
이로 인해 파생 클래스의 올바른 역 직렬화가 수행됩니다. 단점은 사용중인 모든 개체의 이름을 지정하므로 개체를 넣는 목록의 이름이 지정된다는 것입니다.
질문이 매우 인기가 있기 때문에 유형 속성 이름과 해당 값을 제어하려는 경우 수행 할 작업을 추가하는 것이 유용 할 수 있습니다.
긴 방법은 JsonConverter
type 속성을 수동으로 확인하고 설정하여 직렬화를 처리 (역) 할 사용자 지정을 작성하는 것입니다 .
간단한 방법은 사용하는 것입니다 JsonSubTypes , hanldes 모든 상용구 속성을 통해 :
[JsonConverter(typeof(JsonSubtypes), "Sound")]
[JsonSubtypes.KnownSubType(typeof(Dog), "Bark")]
[JsonSubtypes.KnownSubType(typeof(Cat), "Meow")]
public class Animal
{
public virtual string Sound { get; }
public string Color { get; set; }
}
public class Dog : Animal
{
public override string Sound { get; } = "Bark";
public string Breed { get; set; }
}
public class Cat : Animal
{
public override string Sound { get; } = "Meow";
public bool Declawed { get; set; }
}
참고 URL : https://stackoverflow.com/questions/8513042/json-net-serialize-deserialize-derived-types
'developer tip' 카테고리의 다른 글
입력이 완전 제곱인지 확인하는 좋은 알고리즘은 무엇입니까? (0) | 2020.09.19 |
---|---|
Redis 및 Memcache 또는 Redis? (0) | 2020.09.19 |
App.config : 사용자 대 애플리케이션 범위 (0) | 2020.09.19 |
목록의 모든 문자열을 변환하는 방법 (0) | 2020.09.18 |
SSRS 2008 R2-SSRS 2012-ReportViewer : Safari 및 Chrome에서 보고서가 비어 있습니다. (0) | 2020.09.18 |