C# 无法使用JIL序列化程序ExcludeNulls选项

C# 无法使用JIL序列化程序ExcludeNulls选项,c#,.net-core,mediatypeformatter,jil,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 r

我无法使用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);
    }
}
2) JSON字符串:

{
    "pkId":null,
    "description": "Adjustment",
    "isSystem": true,
    "isActive": true
}
最重要的是:

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

(强调矿山)

这表明它只影响序列化操作,而不影响反序列化操作

当序列化对象时,
excludenalls
设置为
true
,如果属性值为
null
,Jil将不会向JSON写入属性。在您的示例中,您正在反序列化到
PaymentTypeBORequest
对象中,该对象本身不支持
pkId
属性的
null
值,因为它不可为null

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

public class PaymentTypeBORequest
{   
    public int? pkId { get; set; }
    ...
}
如果还希望为不可为空的
isSystem
isActive
属性允许
null
,则可以对这些字段执行相同的操作

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