如何在 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;
}
等等..
当我获取此类对象(ClassA
、ClassB
、...)时,我使用以下行将它们反序列化为 BaseClass
var response = await RestClient.PostTaskAsync<List<BaseClass>>(request);
并且后者尝试将它们转换为 ClassA
或 ClassB
,只为所有 BaseClass
对象获得 null
。
我只是希望 List<BaseClass>
包含 ClassA
、ClassB
... 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});
我正在使用 Xamarin 表单并获取 JSON 个对象的列表,这些对象有多个 Types
。例如
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
,只为所有 BaseClass
对象获得 null
。
我只是希望 List<BaseClass>
包含 ClassA
、ClassB
... 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});