Невозможно использовать опцию JIL Serializer ExcludeNulls

Я не могу использовать опцию JIL's Exclude Null. Вместо этого я получаю исключение:

JIL.DeserializationException: "Ожидаемая цифра"

Ниже приведены фрагменты кода.

public Task<InputFormatterResult> ReadAsync(InputFormatterContext context)
{
    if (context == null) throw new ArgumentNullException(nameof(context));

    var request = context.HttpContext.Request; if (request.ContentLength == 0)
    {
        if (context.ModelType.GetTypeInfo().IsValueType)
            return InputFormatterResult.SuccessAsync(Activator.CreateInstance(context.ModelType));
        else return InputFormatterResult.SuccessAsync(null);
    }

    var encoding = Encoding.UTF8;//do we need to get this from the request im not sure yet 

    using (var reader = new StreamReader(context.HttpContext.Request.Body))
    {
        var model =  Jil.JSON.Deserialize(reader, context.ModelType, Jil.Options.ExcludeNulls);
        return InputFormatterResult.SuccessAsync(model);
    }
}

1) Тип модели

public class PaymentTypeBORequest
{   
    public int pkId { get; set; }        
    public string description { get; set; }
    public bool isSystem { get; set; }
    public bool isActive { get; set; }           
}

2) Строка JSON:

{
    "pkId":null,
    "description": "Adjustment",
    "isSystem": true,
    "isActive": true
}

1 ответ

Решение

Описание для excludeNulls Вариант:

писать или нет элементы объекта, чье значение null

(акцент мой)

Это говорит о том, что это влияет только на операции сериализации, а не операции десериализации.

При сериализации объекта с excludeNulls установлен в true, Jil не будет записывать свойства в JSON, если они имеют null ценности. В вашем примере вы десериализуете в PaymentTypeBORequest объект, который сам не поддерживает null значения для pkId собственность, так как это не обнуляемо.

Чтобы решить вашу конкретную проблему, вы можете просто установить pkId быть обнуляемым int, вот так:

public class PaymentTypeBORequest
{   
    public int? pkId { get; set; }
    ...
}

Если вы хотите также разрешить null для не обнуляемых isSystem а также isActive свойства, вы можете выполнять те же операции над этими полями.

Другие вопросы по тегам