【发布时间】:2016-09-29 09:32:10
【问题描述】:
我有一个在 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 获得的“动作”对象中得到了 null。如果我删除 JsonConverter 我得到所有正确序列化除了接口为空,因为序列化程序无法反序列化它。 Json 在调用中的格式正确。谢谢
【问题讨论】:
-
如果您不使用提供的类型,通用转换器的意义何在?
-
@kiziu 我更正了代码,粘贴代码时出错,现在代码与问题中的一样。反序列化返回 null
-
您在
CanConvert中仍有错误,但现在没关系。你的序列化过程有什么不寻常的地方吗?我用JsonConvert.SerializeObject序列化了Model,它工作正常(我刚刚创建了一些虚拟的IMyObject和MyObject)。我现在还可以说的是,您的JsonConverter不会按您的计划工作 - 它不适用于集合中的项目,但适用于整个集合(适用于标记有属性的属性)。 -
@kiziu 序列化工作正常。我的问题是反序列化。 serializer.Deserialize
(reader);它总是返回 null -
好吧,你说序列化也不起作用。我将进一步研究反序列化。
标签: c# json serialization asp.net-web-api