如何在JsonConvert.DeserializeObject中处理null / empty值

时间:2015-08-04 15:15:54

标签: c# json json.net

我有以下代码:

return (DataTable)JsonConvert.DeserializeObject(_data, (typeof(DataTable)));

然后,我试过了:

var jsonSettings = new JsonSerializerSettings
{
    NullValueHandling = NullValueHandling.Ignore
};

return (DataTable)JsonConvert.DeserializeObject<DataTable>(_data, jsonSettings);

返回行引发错误:

{&#34;错误转换价值\&#34; \&#34;输入&#39; System.Double&#39;。&#34;}

许多在线解决方案建议使用可空类型创建自定义Class,但这对我来说不起作用。我不能指望json采用某种格式。我无法控制列数,列类型或列名。

3 个答案:

答案 0 :(得分:103)

您可以向JsonConvert.DeserializeObject提供设置,告诉它如何处理空值,在这种情况下,等等:

var settings = new JsonSerializerSettings
                    {
                        NullValueHandling = NullValueHandling.Ignore,
                        MissingMemberHandling = MissingMemberHandling.Ignore
                    };
var jsonModel = JsonConvert.DeserializeObject<Customer>(jsonString, settings);

答案 1 :(得分:2)

您可以订阅“错误”事件并根据需要忽略序列化错误。

    static void Main(string[] args)
    {
        var a = JsonConvert.DeserializeObject<DataTable>("-- JSON STRING --", new JsonSerializerSettings
        {
            Error = HandleDeserializationError
        });
    }

    public static void HandleDeserializationError(object sender, ErrorEventArgs errorArgs)
    {
        var currentError = errorArgs.ErrorContext.Error.Message;
        errorArgs.ErrorContext.Handled = true;
    }

答案 2 :(得分:0)

可接受的答案非常有效。但是为了使答案全局适用,请在startup.cs中执行以下操作:

    services.AddControllers().AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
    });

答案已经在.Net Core 3.1项目中进行了测试。