다음 Json
과 같은 개체 목록 을 가져 오는 앱을 작성 중입니다.
[
{
"ObjectType": "apple",
"ObjectSize": 35,
"ObjectCost": 4,
"ObjectTaste": "good",
"ObjectColor": "golden"
},
{
"ObjectType": "books",
"ObjectSize": 53,
"ObjectCost": 7,
"Pages": 100
},
{
"ObjectType": "melon",
"ObjectSize": 35,
"ObjectTaste": "good",
"ObjectCost": 5
},
{
"ObjectType": "apple",
"ObjectSize": 29,
"ObjectCost": 8,
"ObjectTaste": "almost good",
"ObjectColor": "red"
}
]
기본 클래스 ItemToSell
(크기, 비용)를 만들고 여기에서 Apple, Melon 및 Book을 파생시킨 다음 " ObjectType
"필드를 기반으로 어떤 클래스에 맞는 역 직렬화를 수행 하고 싶습니다 . ItemToSell
모든 개체가 Apple, Melon 또는 Book 인 개체 목록을 작성하고 싶습니다 .
.Net에서 어떻게 할 수 있습니까?
미리 감사드립니다 :)
편집 : 포함 할 수있는 모든 필드가있는 Big 클래스에서 역 직렬화하는 방법을 알고 있습니다 Base(ObjectType,ObjectSize,ObjectCost,ObjectColor,Pages)
. 그러나 ObjectType
모든 책 항목이나 모든 책에 대해 Pages 필드와 같은 유용성 필드가 없도록 클래스를 구분하기를 원합니다 ObjectTaste
.
얼마 전에 나는 같은 문제가 있었다.
Json.NET을 사용할 수 있지만 json 문서를 제어 할 수없는 경우 (예 : '다른 프레임 워크에 의해 직렬화되었습니다') 다음과 같은 사용자 지정 JsonConverter를 만들어야합니다.
class MyItemConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(ItemToSell).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject obj = JObject.Load(reader);
string discriminator = (string)obj["ObjectType"];
ItemToSell item;
switch (discriminator)
{
case "apple":
item = new Apple();
break;
case "books":
item = new Books();
break;
case "melon":
item = new Melon();
break;
default:
throw new NotImplementedException();
}
serializer.Populate(obj.CreateReader(), item);
return item;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
}
}
그런 다음 JsonSerializerSettings의 변환기에 다음과 같이 추가해야합니다.
JsonSerializerSettings settings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects,
};
settings.Converters.Add(new MyItemConverter());
var items = JsonConvert.DeserializeObject<List<ItemToSell>>(response, settings);
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다