我有一个我在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时,我在&#34; action&#34;我得到FromBody的对象。如果我删除JsonConverter,我会正确序列化除了null的接口,因为序列化程序无法对其进行反序列化。 Jsons在调用中格式正确。谢谢
答案 0 :(得分:1)
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
,这是你的正确方法。