我正在使用Xamarin表单并获取多个Types
的JSON对象列表。 E.g。
class BaseClass
{
public int Id;
}
class ClassA: BaseClass
{
public string Name;
}
class ClassB: BaseClass
{
public DateTime DateOfBirth;
}
依旧......
当我获取此类对象(ClassA
,ClassB
,...)时,我使用以下行将其反序列化为BaseClass
var response = await RestClient.PostTaskAsync<List<BaseClass>>(request);
后者尝试将它们转换为ClassA
或ClassB
,仅为null
个对象获取BaseClass
。
我只希望List<BaseClass>
包含ClassA
,ClassB
...对象。
我在这里缺少什么?是否有Serializer的设置/配置,我可以通过特定的类来获取特定的序列化?
答案 0 :(得分:0)
您告诉它反序列化对BaseClass对象列表的响应......这正是它返回给您的内容。我不完全确定如何进行条件反序列化。我过去使用的一种方法是使用PostTaskResponse对象来定义所有可能的属性,然后将它们转换为预期的结果。
答案 1 :(得分:0)
我能够通过自定义JsonConverter
来实现这一目标public class CustomConverter : JsonConverter {
public override bool CanConvert(Type objectType) {
return (objectType == typeof(BaseClass));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
JObject jo = JObject.Load(reader);
if (jo["identifyingField"].Value<string>() == "ExpectedValue")
return jo.ToObject<ConcreteClass>(serializer);
if (jo["identifyingField"].Value<string>() == "ExpentedValue2")
return jo.ToObject<ConcreteClass2>(serializer);
return null;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
throw new NotImplementedException();
}
}
幸运的是,我的物体中有一个识别区域,使事情变得更容易......
如果您的所有具体类都有唯一的字段,则只需检查jo["identifyingField"] != null
并使用您的新CustomConverter ......
var content = await httpResponse.Content.ReadAsStringAsync();
JsonConverter[] converters = { new CustomConverter() };
var result = JsonConvert.DeserializeObject<SomeObject>(content, new JsonSerializerSettings { Converters = converters});