У меня есть данные телеметрии, которые были сохранены в текстовом поле как JSON. Я пытаюсь перепроектировать POCOs, чтобы беспрепятственно извлекать и представлять эти данные, не делая никаких сквозных циклов ForEach.ServiceStack ORMLite не десериализует JSON, хранящийся в текстовом поле DB
Когда я пытаюсь вручную проанализировать строку JSON в поле данных, она работает. Когда я выбираю через ORMLite, он возвращается с объектом по умолчанию. Что мне не хватает?
Работы
string x = "{\"alive\":true,\"paperStatus\":\"0:NoIssue\"}";
var telemetry = JsonSerializer.DeserializeFromString<KioskTelemetryData>(x);
ли не заполнять поле данных
var exp = Db.From<KioskTelemetryLog>()
.Where(q => q.Identifier == request.Identifier)
.OrderByDescending(q => q.Timestamp);
var data = Db.Select(exp);
Вот что записи данных выглядит следующим образом:
Id Identifier IsCurrent RedemptionCenterId Timestamp Status Data
1 XXX 0 NULL 2015-11-24 11:10:53.527 1 {"alive":true,"paperStatus":"1:LowPaper"}
2 XXX 0 NULL 2015-12-01 12:16:56.653 0 {"alive":true,"paperStatus":"0:NoIssue"}
1 XXX 1 NULL 2015-12-01 18:32:11.337 2 {"alive":false}
А вот POCO которые :
[Alias("TelemetryLog")]
public class KioskTelemetryLog
{
public long Id { get; set; }
public string Identifier { get; set; }
public bool IsCurrent { get; set; }
public int? RedemptionCenterId { get; set; }
public DateTime Timestamp { get; set; }
// 0 = okay, 1 = warning, 2 = error
public sbyte Status { get; set; }
public KioskTelemetryData Data { get; set; }
}
public class KioskTelemetryData
{
public bool Alive { get; set; }
public string PaperStatus { get; set; }
}
Ung - полностью пропустил это в [docs here] (https://github.com/ServiceStack/ServiceStack.OrmLite#pluggable-complex-type-serializers). Можно ли переопределить поведение на основе запроса, как вы можете, с помощью JsonSerializer? – jklemmack
@jklemmack no, вы можете временно переопределить его и вернуть его в конце инструкции, но это не потокобезопасно. Другой подход состоит в том, чтобы объявить свойство как строку, а затем использовать метод, подобный 'KioskTelemetryData GetData()', который возвращает десериализованную версию. – mythz
Ah - Мне очень нравится метод дополнительного метода для десериализации, поскольку одна и та же таблица телеметрии содержит данные для нескольких различных категорий устройств. И я бы, вероятно, использовал его как свойства только для чтения, основанные на типе. Это позволяет мне перевести весь POCO на JSON и отправить его на веб-сайт панели инструментов. – jklemmack