2

У меня есть данные телеметрии, которые были сохранены в текстовом поле как 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; } 
} 

ответ

2

сложный тип сериализатору по умолчанию для OrmLite является JSV Format (для PostgreSQL, который использует JSON за исключением). OrmLite поддерживает pluggable text serializers, например. вы можете изменить SQL Server использовать JSON для сериализации сложных типов с:

SqlServerDialect.Provider.StringSerializer = new JsonStringSerializer(); 

Если это не сериализации правильно это как ошибка сериализации, вы можете попробовать enable logging для получения дополнительной информации об ошибке, например:

LogManager.LogFactory = new ConsoleLogFactory(debugEnabled:true); 
+0

Ung - полностью пропустил это в [docs here] (https://github.com/ServiceStack/ServiceStack.OrmLite#pluggable-complex-type-serializers). Можно ли переопределить поведение на основе запроса, как вы можете, с помощью JsonSerializer? – jklemmack

+0

@jklemmack no, вы можете временно переопределить его и вернуть его в конце инструкции, но это не потокобезопасно. Другой подход состоит в том, чтобы объявить свойство как строку, а затем использовать метод, подобный 'KioskTelemetryData GetData()', который возвращает десериализованную версию. – mythz

+0

Ah - Мне очень нравится метод дополнительного метода для десериализации, поскольку одна и та же таблица телеметрии содержит данные для нескольких различных категорий устройств. И я бы, вероятно, использовал его как свойства только для чтения, основанные на типе. Это позволяет мне перевести весь POCO на JSON и отправить его на веб-сайт панели инструментов. – jklemmack