我有一个在webApi中使用的模型。我的模型如下。
public class Model: IModel
{
public string Data1 { get; set; }
public string Data2 { get; set; }
public int DataInt { get; set; }
[JsonConverter(typeof(JsonConcreteTypeConverter<MyObject>))]
public List<IMyObject> DataObjects { get; set; }
}
}为了反序列化该接口,我创建了自己的jsonConverter类,如下所示。
public class JsonConcreteTypeConverter<TConcreteType>: JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return serializer.Deserialize<TConcreteType>(reader);
}
public override bool CanConvert(Type objectType)
{
bool result;
if (objectType == typeof(MyObject))
{
result = true;
}
else
{
result = false;
}
return result;
}
}这是控制器
[HttpPost]
[Route("api/{ObjectId}/Action")]
public IHttpActionResult RunAsyncAction([FromBody] Model action)
{
IModel modelAction = action;
//Other code
return Content(HttpStatusCode.Accepted, OPERATION_ACCEPTED_MESSAGE);
}我遇到的问题是,当我使用这个jsonConverter时,序列化程序不能反序列化模型,当我调用webApi时,在我得到FromBody的"action“对象中得到null。如果删除JsonConverter,除了接口null之外,所有序列化都是正确的,因为序列化程序不能反序列化它。Jsons在调用中被正确格式化。谢谢
发布于 2016-09-29 10:26:20
JsonConverter的实现不像预期的那样工作,因为您的ReadJson()正在尝试从reader反序列化单个实例,但实际上reader位于ArrayStart的位置,因此这意味着转换器应该处理整个数组的反序列化,而不仅仅是单个项。换句话说- JsonConverter必须处理修饰成员类型的反序列化。
在这种情况下,需要将转换器用于数组项。要使它正常工作,您需要使用不同的属性- JsonProperty及其属性ItemConverterType。结果如下:
[JsonProperty(ItemConverterType = typeof(JsonConcreteTypeConverter<MyObject>))]
public List<IMyObject> DataObjects { get; set; }这将在反序列化项时正确应用转换器,而不是整个数组。
此外,如果您可以详细说明,如果反序列化程序只能处理它的一个实现,那么在Model中拥有接口有什么意义呢?
您还应该纠正这个条件if (objectType == typeof(MyObject)) -它应该使用TConcreteType。
PS。关于注释--最初我想让JsonConverter与列表一起工作,因为我忘记了JsonProperty.ItemConverterType,这在您的例子中是正确的。
https://stackoverflow.com/questions/39766614
复制相似问题