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