自定义JsonConverter无法启动

时间:2018-06-12 17:34:22

标签: c# asp.net-mvc json.net

我创建了一个从JsonConverter扩展的自定义转换器,它将用于ASP.NET MVC和Web API。

public class MyCustomConverter : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        ....
    }
}

我创建了使用该转换器的CustomObject

[JsonConverter(typeof(MyCustomJsonConverter))]
public class CustomObject
{
    ...
}

此转换器可正常用于第二个应用程序(WebApi),这意味着ReadJson中的TestOfUsingJson方法在ReadJson中调用后正在运行。在这种情况下,我没有必要设置任何东西。

对于第一个应用程序(ASP.NET MVC)我遇到了麻烦,对象是从json转换的,但是这个对象不是从我的自定义转换器创建的。 public HttpResponseMessage TestOfUsingJson([FromBody] CustomObject objs) { ... } 的方法未运行。

使用自定义转换器的方法在每个应用程序上看起来相同

Global.asax.cs

ASP.NET MVC JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = new List<JsonConverter> { new MyCustomJsonConverter() } }; 中的Json Serializer的一些设置:

{{1}}

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我准备了一些可能对某人有用的解决方案

  

创建绑定模型

public class BindJson : IModelBinder
{
    public BindJson()
    {

    }

    public virtual object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (controllerContext == null)
            throw new SysException("Missing controller context");

        if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
            return null;

        controllerContext.HttpContext.Request.InputStream.Position = 0;

        using (var reader = new StreamReader(controllerContext.HttpContext.Request.InputStream))
        {
            var data = reader.ReadToEnd();

            if (!String.IsNullOrEmpty(bodyText))
            {
                return JsonConvert.DeserializeObject(data, bindingContext.ModelType);
            }
        }

        return null;
    }

}
  

在Global.asax.cs中分配活页夹

..
ModelBinders.Binders.Add(typeof(BindJson), new BindJson());
..
  

将活页夹分配到班级

[ModelBinder(typeof(BindJson))]
public class CustomObject
{
    ...
}
  

在方法

中调用活页夹
public HttpResponseMessage TestOfUsingJson(CustomObject objs)
{
    ...
}