JsonConvert.DeserializeObject <数据表>(jsondata);强制日期时间到字符串列

时间:2018-05-03 16:26:10

标签: c# json json.net

这是我的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<DataTable>(jsondata);从json转换为datatable,但是使用null datetime列我得到以下错误:

  

字符串未被识别为有效的DateTime。不能存储&lt;&gt;在   DATETIMEColumn。预期类型是DateTime。

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

2 个答案:

答案 0 :(得分:2)

您可以将Serializer设置定义为忽略DateTime解析,以便将动态JOSN转换为DataTable Downnside 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

答案 1 :(得分:0)

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

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