почему JSON. NET выводит значения DateTime в моей DataTable в этом формате? - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть служба, которая сериализует DataTable в JSON, и когда я получаю данные службы, я хочу десериализовать обратно в DataTable ... проблема в том, что я не могу, потому что JSON. NET добавление в сериализацию чего-то, что затем не распознается ...

Все значения DateTime в моей DataTable выглядят так:

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

JSON. NET вывод сериализованный JSON, как это ... так что я ожидаю, что он также знает, как десериализовать его ... как мне получить сериализованную дату в виде простой строки, чтобы я мог десериализовать данные?

EDIT: у меня есть метод контроллера, возвращающий данные.

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

И метод, который вызывает контроллер:

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 database и метод Query возвращают DataTable.

Обратите внимание, что независимо от того, возвращаю ли я DataTable напрямую или использую метод JsonConvert.SerializeObject() для преобразования его в строку JSON перед возвратом, возвращаемое значение заканчивается будучи тем же самым JSON. * 1 019 *

РЕДАКТИРОВАТЬ 2: Для тех, кто может прийти к рассмотрению этого вопроса позже, я ошибочно предполагал, что DataTable на самом деле был на низком уровне ... Я предполагал, что это была просто какая-то форма массива строк, и это совершенно неправильно ... Объект DataTable гораздо сложнее, чем я предполагал. Он обрабатывает входные данные из разных источников данных по-разному (поэтому данные MS SQL выглядят иначе, чем MySQL данные, поскольку они загружаются в DataTable в разных форматах объектов).

1 Ответ

2 голосов
/ 21 апреля 2020

Похоже, что драйвер базы данных, который вы используете, не использует 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...