Newtonsoft.Json.JsonReaderException: не удалось преобразовать строку в DateTime: - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь вставить некоторую дату в мою локальную базу данных.Я получаю сообщение об ошибке:

{Newtonsoft.Json.JsonReaderException: не удалось преобразовать строку в DateTime: 20-09-1982 12:00:00.Путь '[0] .BIRTHDAY', строка 1, позиция 71.

Вот мой код:

var insertdata = new ClientIndividualTable
{
     COID = item.COID,
     CLIENTID = item.CLIENTID,
     BIRTHDAY = Convert.ToDateTime(item.BIRTHDAY)
};

await DefaultSettings.conn.InsertOrReplaceAsync(insertdata);

Я также пытался все еще получать сообщение об ошибке:

DateTime.Parse(item.BIRTHDAY)

как я могу исправить и избежать этого в будущем?

Ответы [ 2 ]

2 голосов
/ 19 сентября 2019

Похоже, ваша ошибка не в строке, начинающейся с var insertdata = new ClientIndividualTable, но несколько строк до этого.

Вероятно, ваша ошибка возникает в строке, аналогичной этой.

MyJsonClass item = JsonConvert.DeserializeObject<MyJsonClass>(fileText);

Вы должны создать конвертер DateTime, чтобы Newtonsoft знала, как обрабатывать используемый пользовательский формат.После этого вы должны украсить класс, используемый для добавления атрибута в свойство DateTime.

Пример файла JSON:

{
    "COID" : "myCompanyId",
    "CLIENTID" : "myClientId",
    "BIRTHDAY" : "20-09-1982 12:00:00",
}

Класс, соответствующий структуре JSON:

public class MyJsonClass
{
    public string COID { get; set; }
    public string CLIENTID { get; set; }
    [JsonConverter(typeof(CustomDateTimeConverter))]
    public DateTime? BIRTHDAY { get; set; }
}

И JsonConverter будет похоже на это.

public class CustomDateTimeConverter : DateTimeConverterBase
{
    private const string Format = "dd-MM-yyyy HH:mm:ss";

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue(((DateTime)value).ToString(Format));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.Value == null)
        {
            return null;
        }

        var s = reader.Value.ToString();
        DateTime result;
        if (DateTime.TryParseExact(s, Format, CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
        {
            return result;
        }

        return null;
    }
}

Примечание: мой ответ основан на этом сообщении в блоге

2 голосов
/ 19 сентября 2019

Вы можете использовать DateTime.ParseExact, как этот

DateTime.ParseExact("20-09-1982 12:00:00", "dd-MM-yyyy HH:mm:ss", CultureInfo.InvariantCulture);

ParseExact позволяет вам точно указать формат, который вы храните, независимо от того, сколько дополнительных символов может присутствовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...