ServiceStack ORMLite不反序列化存储在DB文本字段中的JSON

时间:2016-02-03 20:06:31

标签: json servicestack ormlite-servicestack servicestack-text

我有一些遥测数据作为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; }
}

1 个答案:

答案 0 :(得分:2)

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

!(condition1 & condition2)

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

SqlServerDialect.Provider.StringSerializer = new JsonStringSerializer();