Пользовательский JsonConverter не запускается - PullRequest
0 голосов
/ 12 июня 2018

Я создал пользовательский конвертер с расширением JsonConverter, который будет использоваться для ASP.NET MVC и веб-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.И в этом случае мне не нужно было ничего настраивать.

Для первого приложения (ASP.NET MVC) у меня проблема, объект конвертируется из json, но этот объект не создается из моего пользовательскогоконвертер.Метод ReadJson не работает.

Метод, который использует пользовательский конвертер, выглядит одинаково для каждого приложения

public HttpResponseMessage TestOfUsingJson([FromBody] CustomObject objs)
{
    ...
}

Некоторые настройки Json Serializer в ASP.NET MVC Global.asax.cs:

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
    Converters = new List<JsonConverter> { new MyCustomJsonConverter() }
};

Что я делаю не так?

1 Ответ

0 голосов
/ 12 июня 2018

Я подготовил какое-то решение, которое может кому-то пригодиться

Создать модель связывания

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)
{
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...