2

Certaines données de télémétrie ont été stockées dans un champ de texte en tant que JSON. J'essaie d'effectuer une ingénierie inverse des POCO pour extraire et présenter de façon transparente ces données sans avoir à effectuer de boucles ForEach post-traitement.ServiceStack ORMLite ne désérialisant pas JSON stocké dans le champ de texte DB

Lorsque je tente d'analyser manuellement la chaîne JSON dans le champ de données, cela fonctionne. Lorsque je sélectionne via ORMLite, il revient avec l'objet par défaut. Qu'est-ce que je rate?

Travaux

string x = "{\"alive\":true,\"paperStatus\":\"0:NoIssue\"}"; 
var telemetry = JsonSerializer.DeserializeFromString<KioskTelemetryData>(x); 

ne remplit pas de champ de données

var exp = Db.From<KioskTelemetryLog>() 
        .Where(q => q.Identifier == request.Identifier) 
        .OrderByDescending(q => q.Timestamp); 

var data = Db.Select(exp); 

Voici ce que les enregistrements de données ressemblent à:

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} 

Et voici le Poços :

[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; } 
} 

Répondre

2

Le type complexe par défaut sérialiseur pour OrmLite est le JSV Format (sauf pour PostgreSQL qui utilise JSON). OrmLite prend en charge pluggable text serializers, par ex. vous pouvez changer SQL Server pour utiliser JSON pour sérialisation types complexes:

SqlServerDialect.Provider.StringSerializer = new JsonStringSerializer(); 

Si ce n'est pas sérialisation correctement, il est comme une erreur de sérialisation, vous pouvez essayer enable logging pour plus d'informations sur l'erreur, par exemple:

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

Ung - totalement manqué que dans le [docs ici] (https://github.com/ServiceStack/ServiceStack.OrmLite#pluggable-complex-type-serializers). Est-il possible de remplacer le comportement sur une base de requête comme vous pouvez avec le JsonSerializer? – jklemmack

+0

@jklemmack non, vous pouvez le remplacer temporairement et le rétablir dans une instruction finally, mais ce n'est pas threadsafe. Une autre approche consiste à déclarer la propriété sous forme de chaîne, puis à utiliser une méthode comme 'KioskTelemetryData GetData()' qui renvoie la version désérialisée. – mythz

+0

Ah - J'aime beaucoup l'approche par méthode supplémentaire pour effectuer la désérialisation, car la même table de télémesure contient des données pour plusieurs catégories différentes d'appareils. Et je l'implémenterais probablement en tant que propriétés en lecture seule basées sur le type. Cela me permet de re-traduire l'intégralité de POCO en JSON et de l'alimenter sur le site Web du tableau de bord. – jklemmack