首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JsonConverter空整个模型

JsonConverter空整个模型
EN

Stack Overflow用户
提问于 2016-09-29 09:32:10
回答 1查看 455关注 0票数 1

我有一个在webApi中使用的模型。我的模型如下。

代码语言:javascript
复制
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类,如下所示。

代码语言:javascript
复制
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;
    }
}

这是控制器

代码语言:javascript
复制
[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在调用中被正确格式化。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-29 10:26:20

JsonConverter的实现不像预期的那样工作,因为您的ReadJson()正在尝试从reader反序列化单个实例,但实际上reader位于ArrayStart的位置,因此这意味着转换器应该处理整个数组的反序列化,而不仅仅是单个项。换句话说- JsonConverter必须处理修饰成员类型的反序列化。

在这种情况下,需要将转换器用于数组项。要使它正常工作,您需要使用不同的属性- JsonProperty及其属性ItemConverterType。结果如下:

代码语言:javascript
复制
[JsonProperty(ItemConverterType = typeof(JsonConcreteTypeConverter<MyObject>))]
public List<IMyObject> DataObjects { get; set; }

这将在反序列化项时正确应用转换器,而不是整个数组。

此外,如果您可以详细说明,如果反序列化程序只能处理它的一个实现,那么在Model中拥有接口有什么意义呢?

您还应该纠正这个条件if (objectType == typeof(MyObject)) -它应该使用TConcreteType

PS。关于注释--最初我想让JsonConverter与列表一起工作,因为我忘记了JsonProperty.ItemConverterType,这在您的例子中是正确的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39766614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档