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

How to deserialize json objects to specific objects in Restsharp/Json.net on Xamarin Forms

我正在使用 Xamarin 表单并获取 JSON 个对象的列表,这些对象有多个 Types。例如

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,只为所有 BaseClass 对象获得 null。 我只是希望 List<BaseClass> 包含 ClassAClassB... objects.

我在这里错过了什么? Serializer 是否有 setting/configuration,我可以在其中传递特定的 类 以获得特定的序列化?

您告诉它反序列化对 BaseClass 对象列表的响应...这正是它返回给您的内容。我不完全确定您将如何进行条件反序列化。我过去使用的一种方法是拥有一个 PostTaskResponse 对象,该对象定义您可能拥有的所有可能属性,然后将它们转换为您的预期结果。

我能够使用自定义 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});