【问题标题】:How to deserialize json objects to specific objects in Restsharp/Json.net on Xamarin Forms如何在 Xamarin Forms 上将 json 对象反序列化为 Restsharp/Json.net 中的特定对象
【发布时间】:2018-03-05 16:44:46
【问题描述】:

我正在使用 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&lt;BaseClass&gt; 包含 ClassAClassB... 对象。

我在这里缺少什么?是否有 Serializer 的设置/配置,我可以在其中传递特定的类来获得专门的序列化?

【问题讨论】:

  • 这个列表对派生类一无所知,只知道基类。检查您的设计。
  • 同意。有没有办法指定它?

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


【解决方案1】:

我可以使用自定义的 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});

【讨论】:

  • 我也是,尽管它的实现略有不同,因为ToObject&lt;&gt;() 并没有真正为我工作。谢谢。
【解决方案2】:

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

【讨论】:

  • 你能发一个sn-p吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 2022-11-15
  • 2013-07-25
相关资源
最近更新 更多