【问题标题】:JsonConvert.DeserializeObject<DataTable>(jsondata); force datetime to string columnJsonConvert.DeserializeObject<Da​​taTable>(jsondata);强制日期时间到字符串列
【发布时间】:2018-10-14 01:10:13
【问题描述】:

这是我的 json :

[
 {"ID":"1","DATETIME":"2018-05-02T00:00:00"},
 {"ID":"2","DATETIME":"2018-05-02T00:00:00"},
 {"ID":"3","DATETIME":""},
 {"ID":"4","DATETIME":"2018-05-02T00:00:00"}
]

我正在使用 DataTable dt = JsonConvert.DeserializeObject&lt;DataTable&gt;(jsondata); 从 json 转换为数据表,但是使用 null 日期时间列我收到以下错误:

字符串未被识别为有效的日期时间。无法将 存储在 日期时间列。预期类型为 DateTime。

那么如何将我的 json 转换为所有列都是字符串的数据表

【问题讨论】:

  • 为什么不定义一个类并将其反序列化为一个 IEnumerable?
  • @GPW 我的 json 有动态列
  • @jimboR 根据您的示例,没有任何动态
  • @DavidG:视情况而定,我的 json 字符串可能有一些其他属性,但 ID 和 DATETIME 始终存在。
  • @jimboR 您可以将类定义为具有可选数据的可空字段,它应该可以正常工作 - 如果它们不在 JSON 中,这些字段将只是空......这就是我想要的做。不过,下面接受的答案对您的具体问题有好处。

标签: c# json json.net


【解决方案1】:

您可以将Serializer 设置定义为忽略DateTime 解析,以便将动态JOSN 转换为DataTable缺点DateTime 将在DataTable 中被读取为字符串。

var settings = new JsonSerializerSettings
        {
            DateParseHandling = DateParseHandling.None
        };
        
string json = "[{\"ID\":\"1\",\"DATETIME\":\"2018-05-02T00:00:00\"}, {\"ID\":\"1\",\"DATETIME\":\"\"}]";

var jsonObj = JsonConvert.DeserializeObject<DataTable>(json, settings);
        
Console.WriteLine(jsonObj.Rows.Count);
        

您可以在here 阅读DateParseHandling 设置。

检查这个Live Fiddle

【讨论】:

    【解决方案2】:

    序列化为DataTable 的问题在于您可以控制列的创建方式,而在您的示例中,空日期是问题所在。虽然可以创建您自己的自定义 JsonConverter,但这会引用复杂且大量代码,但我的建议是反序列化为 List&lt;Dictionary&lt;string, string&gt;&gt;。例如:

    var result = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(jsondata);
    

    现在您可以循环浏览您的动态数据:

    foreach (var dictionary in result)
    {
        foreach (var kvp in dictionary)
        {
            Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}");
        }
    }
    

    这会给你这样的输出:(包括任何额外的属性都在你的 JSON 数据中:

    Key: ID, Value: 1
    Key: DATETIME, Value: 2018-05-02T00:00:00
    Key: ID, Value: 2
    Key: DATETIME, Value: 2018-05-02T00:00:00
    Key: ID, Value: 3
    Key: DATETIME, Value: 
    Key: ID, Value: 4
    Key: DATETIME, Value: 2018-05-02T00:00:00
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多