我有以下代码:
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)
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)隔离开来,反序列化不需要关心数据属性,这样两个人就可以一起工作了,反序列化语句会干净简洁。
您可以订阅“错误”事件并根据需要忽略序列化错误。
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)