Json.net 파생형 시리얼화/디시리얼화
json.net (소프트웨어)
서류를 뒤지고 있습니다만, 이것이나 가장 좋은 방법을 찾을 수 없습니다.
public class Base
{
public string Name;
}
public class Derived : Base
{
public string Something;
}
JsonConvert.Deserialize<List<Base>>(text);
이제 일련 목록에 파생 개체가 있습니다.목록을 역직렬화하고 파생 유형을 다시 가져오려면 어떻게 해야 합니까?
Type Name Handling을 활성화하여 설정 파라미터로 (de) serializer에 전달해야 합니다.
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);
이것에 의해, 파생 클래스의 올바른 역직렬화가 실현됩니다.단점은 사용 중인 모든 객체에 이름을 붙이기 때문에 객체를 삽입하는 목록에 이름을 붙일 수 있다는 것입니다.
유형을 저장하려는 경우text
(이 시나리오에서는 필요하지만) 를 사용할 수 있습니다.JsonSerializerSettings
.
참조: Newtonsoft JSON을 사용하여 JSON을 IEnumerable <BaseType>으로 역직렬화하는 방법을 참조하십시오.네트워크
그래도 조심해.이 이외의 것을 사용하는 경우TypeNameHandling = TypeNameHandling.None
보안 취약성에 노출될 수 있습니다.
이 질문은 매우 인기가 있기 때문에 유형 속성 이름과 값을 제어하려는 경우 수행할 작업을 추가하는 것이 유용할 수 있습니다.
긴 길은 커스텀을 쓰는 것이다.JsonConverter
는, 타입 속성을 수동으로 체크해 설정함으로써(탈(탈) 처리를 실시합니다.
보다 간단한 방법은 JsonSubTypes를 사용하는 것입니다.JsonSubTypes는 속성을 통해 모든 보일러 플레이트를 처리합니다.
[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; }
}
이 JsonKnown 사용타입은 매우 유사한 방법으로 json에 식별자를 추가합니다.
[JsonConverter(typeof(JsonKnownTypeConverter<BaseClass>))]
[JsonKnownType(typeof(Base), "base")]
[JsonKnownType(typeof(Derived), "derived")]
public class Base
{
public string Name;
}
public class Derived : Base
{
public string Something;
}
이제 json에서 개체를 직렬화할 때 추가됩니다."$type"
와 함께"base"
그리고."derived"
값 및 이 값은 역직렬화에 사용됩니다.
시리얼라이즈드 리스트의 예:
[
{"Name":"some name", "$type":"base"},
{"Name":"some name", "Something":"something", "$type":"derived"}
]
직렬화 메서드에서 개체만 추가
var jsonMessageBody = JsonSerializer.Serialize<object>(model);
언급URL : https://stackoverflow.com/questions/8513042/json-net-serialize-deserialize-derived-types
'programing' 카테고리의 다른 글
Zend 프레임워크 및 Wordpress 통합 (0) | 2023.03.19 |
---|---|
네스트된 ng-repeat이 비어있지 않은 경우에만 요소를 표시하려면 어떻게 해야 합니까? (0) | 2023.03.19 |
"REM INSERTING in TAB" 명령어는 정확히 어떤 기능을 합니까?Oracle의 LE_NAME"? (0) | 2023.03.19 |
TypeScript: 객체.키 반환 문자열[ ] (0) | 2023.03.19 |
Oracle SQL Developer가 DB 연결을 닫지 않도록 하려면 어떻게 해야 합니까? (0) | 2023.03.19 |