无法使用JIL序列化器ExcludeNulls选项

时间:2018-10-20 12:05:07

标签: c# .net-core mediatypeformatter jil

我无法使用JIL的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 个答案:

答案 0 :(得分:1)

description for the excludeNulls option是:

  

是否写入值为null的对象成员

(重点是我的)

这表明它仅影响 serialisation 操作,而不影响 deserialization 操作。

在将excludeNulls设置为true的对象进行序列化时,如果Jil具有null值,则不会将属性写入JSON。在您的示例中,您正在反序列化PaymentTypeBORequest对象中,该对象本身不支持null属性的pkId值,因为它不能为空。 / p>

为了解决您的特定问题,您可以将pkId设置为可为空的int,如下所示:

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

如果您还希望为不可为空的nullisSystem属性允许isActive,则可以在这些字段上执行相同的操作。