【问题标题】:JsonSerializationException while parsing JSON to DataTable将 JSON 解析为 DataTable 时出现 JsonSerializationException
【发布时间】:2020-04-15 07:16:50
【问题描述】:

我正在尝试将 JSON 数据解析为 C# 中的 DataTable。但是在解析时我看到了Newtonsoft.Json.JsonSerializationException

将值“”转换为类型“System.DateTime”时出错。路径 '[1]['Created Date']',第 8 行,位置 20。

这是我用来解析数据的代码:

DataTable dtData = JArray.Parse(jsonString).ToObject<DataTable>(); 

示例 JSON 数据:

[
  {
    "rno": 1,
    "Name": "XYZ",
    "Created Date": "2014-04-30T14:39:12.2397769Z"
  },
  {
    "rno": 2,
    "Name": "ABC",
    "Created Date": ""
  }
]

谁能告诉我如何管理这种类型的场景。我只是想在向数据表中添加数据时防止数据类型发生变化。应该将列数据类型设置为字符串,而不是 DateTime

【问题讨论】:

  • 如果你看一下第二个条目中created date 的值,你注意到什么了吗?
  • 另外,退一步解释一下为什么要将 JSON 转换为 DataTable。这很奇怪。您不希望将其转换为具体类型的列表吗?为什么特别想要DataTable
  • 是否支持DataTable Nullable&lt;T&gt; @Eldar?
  • 使用 app.quicktype.io?share=wq0HmxtiEUoJoDaIEOmQ 将其解析为标准 C# 类型。然后手动生成DataTable并手动填充。
  • 您的问题是 "Created Date" 被识别为 DateTime 字符串 - 但 "" 不是有效的 DateTime 字符串。要禁用自动DateTime 识别,请设置DateParseHandling = DateParseHandling.None,如Json.NET Disable the deserialization on DateTime 所示。现在您的DataTable 将使用string 列而不是DateTime 列创建。如有必要,您可以在反序列化后对其进行后处理以将列转换为DateTime

标签: c# json asp.net-mvc datatable json.net


【解决方案1】:

在将 JSON 反序列化为 DataTable 时,Json.Net 会自动尝试根据数组中第一项的属性值来确定每一列的数据类型。在这种情况下,第一项具有Created Date 属性的日期字符串,因此该列的数据类型被设置为DateTime。当解析器遇到 Created Date 属性的空字符串时,第二项会发生错误。空字符串无法转换为DateTime,因此会生成JsonSerializationException

如果您希望Created Date 列始终被解析为字符串而不是DateTime,您可以将DateParseHandling 设置为None。这将防止您看到的错误。

更改此代码:

DataTable dtData = JArray.Parse(jsonString).ToObject<DataTable>();

到这里:

var settings = new JsonSerializerSettings { DateParseHandling = DateParseHandling.None };
DataTable dtData = JsonConvert.DeserializeObject<DataTable>(jsonString, settings);

小提琴:https://dotnetfiddle.net/EWWGT0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 2013-01-23
    • 2018-04-25
    • 1970-01-01
    • 2017-09-03
    相关资源
    最近更新 更多