c# - 为什么 JSON.NET 在我的 DataTable 中以这种格式输出 DateTime 值?

标签 c# json asp.net-web-api json.net

我有一个将 DataTable 序列化为 JSON 的服务,当我检索服务数据时,我想反序列化回 DataTable...问题是,我不能,因为 JSON.NET 在序列化中添加了一些内容然后它无法识别...

我的数据表中的所有日期时间值最终看起来像这样:

"date_time_value":{"IsValidDateTime":true,"Year":2020,"Month":4,"Day":20,"Hour":14,"Minute":50,"Second":46,"Microsecond":0,"Millisecond":0}

JSON.NET 像这样输出序列化的 JSON...所以我希望它也知道如何反序列化它...如何将日期序列化为简单字符串以便我可以反序列化数据?

编辑:我有一个返回数据的 Controller 方法。

[HttpPost]
[Route("Query")]
public ActionResult<string> Query([FromBody]SqlDto content)
{
    return Ok(_mySqlGenericService.Query(content.HostnameOrIpAddress, content.Username, content.Password, content.SqlCommand, content.SqlParameters));
}

Controller 调用的方法:

public string Query(string hostnameOrIp, string username, string password, string sqlCommand, List<SqlParameter> sqlParameters = null)
{
    var mySqlDatabaseConnection = new MySqlDatabaseConnection(hostnameOrIp, username, password);

    DataTable dt = mySqlDatabaseConnection.Query(sqlCommand, ConvertQueryParamListToTupleList(sqlParameters));

    return JsonConvert.SerializeObject(dt);
}

MySqlDatabaseConnection 类仅连接到 MySQL 数据库,Query 方法返回 DataTable。

请注意,无论我直接返回DataTable还是使用JsonConvert.SerializeObject()方法将其转换为JSON字符串后再返回,返回值最终都是相同的JSON。

EDIT2:对于以后可能会看到这个问题的任何人,我错误地假设了 DataTable 实际上处于低级别......我认为它只是某种形式的字符串数组,这是完全错误的...... DataTable 对象比我意识到的要复杂得多。它以不同的方式处理来自不同数据源的输入(因此 MS SQL 数据看起来与 MySQL 数据不同,因为它们以不同的对象格式加载到 DataTable)。

最佳答案

看来您正在使用的数据库驱动程序不使用System.DateTime来表示日期,而且可能无论如何也不应该这样做。它似乎是 MySqlDateTime根据其序列化的属性来判断类型。 Json.net 无法识别这种类型,但您可能有一个后备转换器将其视为对象。我自己对这种类型进行了一些测试,它转换为 null

我不知道您是否会为此找到一个现成的转换器,它可能存在于某个地方,幸运的是创建一个应该很容易。

public class MySqlDateTimeConverter : JsonConverter<MySqlDateTime>
{
    public override MySqlDateTime ReadJson(JsonReader reader, Type objectType, MySqlDateTime existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var dateTime = serializer.Deserialize(reader, typeof(DateTime));
        return new MySqlDateTime((DateTime)dateTime);
    }

    public override void WriteJson(JsonWriter writer, MySqlDateTime value, JsonSerializer serializer)
    {
        var dateTime = value.GetDateTime();
        serializer.Serialize(writer, dateTime);
    }
}

关于c# - 为什么 JSON.NET 在我的 DataTable 中以这种格式输出 DateTime 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61335802/

相关文章:

java - Xml转JSon,字符问题

c# - 将一组json对象发送到web api,如何格式化url?

asp.net - 使用 MVVM 模式的 Asp .NET Web API

c# - ElasticSearch:检索给定时间戳的最新文档

json - 如何配置VS Code以在.json文件上启用代码完成(jsonschema支持)?

c# - 如何按多个通用 linq 表达式分组

C# 类型比较 : Type. 等于 vs 运算符 ==

c# - Entity Framework : How to update child data in foreach loop

java - 将 JSON 添加到 spring rest Controller 中的模型时如何删除转义字符

c# - 如何将这段代码转换为泛型?