JsonConverter使整个模型无效

时间:2016-09-29 09:32:10

标签: c# json serialization asp.net-web-api

我有一个我在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在调用中格式正确。谢谢

1 个答案:

答案 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,这是你的正确方法。