如何在Xamarin Forms上的Restsharp / Json.net中将json对象反序列化为特定对象

时间:2018-03-05 16:44:46

标签: xamarin.forms json.net restsharp json-deserialization

我正在使用Xamarin表单并获取多个Types的JSON对象列表。 E.g。

class BaseClass
{
    public int Id;
}

class ClassA: BaseClass
{
    public string Name;
}

class ClassB: BaseClass
{
    public DateTime DateOfBirth;
}

依旧......

当我获取此类对象(ClassAClassB,...)时,我使用以下行将其反序列化为BaseClass

var response = await RestClient.PostTaskAsync<List<BaseClass>>(request);

后者尝试将它们转换为ClassAClassB,仅为null个对象获取BaseClass。 我只希望List<BaseClass>包含ClassAClassB ...对象。

我在这里缺少什么?是否有Seri​​alizer的设置/配置,我可以通过特定的类来获取特定的序列化?

2 个答案:

答案 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

即可

json.net has key method?

并使用您的新CustomConverter ......

var content = await httpResponse.Content.ReadAsStringAsync();    
JsonConverter[] converters = { new CustomConverter() };
var result = JsonConvert.DeserializeObject<SomeObject>(content, new JsonSerializerSettings { Converters = converters});