【问题标题】:ServiceStack ORMLite not deserializing JSON stored in DB text fieldServiceStack ORMLite 没有反序列化存储在 DB 文本字段中的 JSON
【发布时间】:2016-02-03 20:06:31
【问题描述】:

我有一些遥测数据作为 JSON 存储在文本字段中。我正在尝试对 POCO 进行逆向工程,以无缝提取和呈现该数据,而无需执行任何 ForEach 循环的后处理。

当我尝试手动解析数据字段中的 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; }
}

【问题讨论】:

    标签: json servicestack ormlite-servicestack servicestack-text


    【解决方案1】:

    OrmLite 的默认复杂类型序列化程序是JSV Format(使用 JSON 的 PostgreSQL 除外)。 OrmLite 确实支持pluggable text serializers,例如您可以更改 SQL Server 以使用 JSON 序列化复杂类型:

    SqlServerDialect.Provider.StringSerializer = new JsonStringSerializer();
    

    如果它没有正确序列化它就像一个序列化错误,您可以尝试enable logging 以获取有关该错误的更多信息,例如:

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

    【讨论】:

    • Ung - 完全错过了 [docs here] (github.com/ServiceStack/…) 中的内容。是否可以像使用 JsonSerializer 一样基于查询覆盖行为?
    • @jklemmack 不,您可以暂时覆盖它并在 finally 语句中恢复它,但这不是线程安全的。另一种方法是将属性声明为字符串,然后使用KioskTelemetryData GetData() 之类的方法返回反序列化版本。
    • 啊 - 我真的很喜欢反序列化的额外方法,因为同一个遥测表保存了几个不同类别的设备的数据。而且我可能会根据类型将其实现为只读属性。这让我可以将整个 POCO 重新翻译成 JSON 并将其提供给仪表板网站。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多