반응형
JSON을 IEnumerable로 역 직렬화하는 방법 Newtonsoft JSON.NET으로
이 JSON이 주어지면 :
[
{
"$id": "1",
"$type": "MyAssembly.ClassA, MyAssembly",
"Email": "me@here.com",
},
{
"$id": "2",
"$type": "MyAssembly.ClassB, MyAssembly",
"Email": "me@here.com",
}
]
및 이러한 클래스 :
public abstract class BaseClass
{
public string Email;
}
public class ClassA : BaseClass
{
}
public class ClassB : BaseClass
{
}
JSON을 다음과 같이 역 직렬화하려면 어떻게해야합니까?
IEnumerable<BaseClass> deserialized;
추상적 JsonConvert.Deserialize<IEnumerable<BaseClass>>()
이라고 불평 하기 때문에 사용할 수 없습니다 BaseClass
.
당신은 필요합니다 :
JsonSerializerSettings settings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All
};
string strJson = JsonConvert.SerializeObject(instance, settings);
따라서 JSON은 다음과 같습니다.
{
"$type": "System.Collections.Generic.List`1[[MyAssembly.BaseClass, MyAssembly]], mscorlib",
"$values": [
{
"$id": "1",
"$type": "MyAssembly.ClassA, MyAssembly",
"Email": "me@here.com",
},
{
"$id": "2",
"$type": "MyAssembly.ClassB, MyAssembly",
"Email": "me@here.com",
}
]
}
그런 다음 역 직렬화 할 수 있습니다.
BaseClass obj = JsonConvert.DeserializeObject<BaseClass>(strJson, settings)
문서 : TypeNameHandling 설정
다음은 json에서 $ type을 채우지 않고 수행하는 방법입니다.
Json 변환기 :
public class FooConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(BaseFoo));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject jo = JObject.Load(reader);
if (jo["FooBarBuzz"].Value<string>() == "A")
return jo.ToObject<AFoo>(serializer);
if (jo["FooBarBuzz"].Value<string>() == "B")
return jo.ToObject<BFoo>(serializer);
return null;
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
그것을 사용 :
var test = JsonConvert.DeserializeObject<List<BaseFoo>>(result, new JsonSerializerSettings()
{
Converters = { new FooConverter() }
});
여기 에서 가져온
deserialize하는 동안 다음 JsonSerializerSettings 구성을 사용하십시오.
new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.Objects
})
클래스에서 열거 형을 래핑 할 수도 있습니다.
class Wrapper
{
IEnumerable<BaseClass> classes;
}
그런 다음 이것을 직렬화하고 역 직렬화하십시오.
반응형
'Development Tip' 카테고리의 다른 글
MVC의 대안 (0) | 2020.11.21 |
---|---|
MySQL에서 열과 테이블 이름이 대소 문자를 구분합니까? (0) | 2020.11.21 |
Excel 파일 (.xls / .xlsx)을 읽는 최적의 방법 (0) | 2020.11.21 |
Python에서 memoryview의 요점은 정확히 무엇입니까 (0) | 2020.11.21 |
스크롤하는 동안 Jquery .on ( 'scroll')이 이벤트를 발생시키지 않습니다. (0) | 2020.11.21 |