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

Kyl*_*yle 49 c# json json.net

我有以下代码:

return (DataTable)JsonConvert.DeserializeObject(_data, (typeof(DataTable)));
Run Code Online (Sandbox Code Playgroud)

然后,我试过:

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

return (DataTable)JsonConvert.DeserializeObject<DataTable>(_data, jsonSettings);
Run Code Online (Sandbox Code Playgroud)

返回行抛出错误:

{"转换值\"\"时出错,输入'System.Double'."}

网上有很多解决方案建议Class使用可空类型创建自定义,但这对我不起作用.我不能指望json处于某种格式.我无法控制列数,列类型或列名称.

Tho*_*röm 136

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

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

  • MissingMemberHandling = MissingMemberHandling.Ignore 是默认值。不需要添加它。 (4认同)
  • 在我看来,这些应该是解串器的默认设置。默认情况下,它不应该仅仅因为遇到空值而出错并破坏您的代码 (3认同)

Eyn*_*ang 19

我更喜欢 Thomas Hagström 的另一种解决方案是在成员变量上使用 property 属性。

例如,当我们调用一个 API 时,它可能会或可能不会返回错误消息,因此我们可以为 ErrorMessage 设置 NullValueHandling 属性:


    public class Response
    {
        public string Status;

        public string ErrorCode;

        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public string ErrorMessage;
    }


    var response = JsonConvert.DeserializeObject<Response>(data);
Run Code Online (Sandbox Code Playgroud)

这样做的好处是将数据定义(what)和反序列化(use)隔离开来,反序列化不需要关心数据属性,这样两个人就可以一起工作了,反序列化语句会干净简洁。


Dot*_*Man 5

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

    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;
    }
Run Code Online (Sandbox Code Playgroud)