有没有办法使ServiceStack.Redis使用JSON.NET而不是ServiceStack.Text?

时间:2014-04-22 18:44:23

标签: c# javascript json redis servicestack

有没有办法让ServiceStack.Redis使用JSON.NET而不是ServiceStack.Text?

我问的原因是因为在ServiceStack.Text中将整数转换为字符串而在JSON.NET中没有转换为字符串的特定情况

通过网络将数据发送到网络时,这是一件大事。

在我们的具体情况中,JSON.NET将数据存储为
'抵消':0
和ServiceStack.Text将数据存储为
'抵消':'0'

为什么这很糟糕?在javascript中,29 + 0 = 29但29 +'0'='290'。这意味着使用ServiceStack.Text

,数组[29 + offset]会产生奇怪的结果

我知道这是一个特定的用例,但是使用JSON.NET(行为符合预期)而不是ServiceStack.Text(速度提高3倍但行为不符合预期)要容易得多。

2 个答案:

答案 0 :(得分:2)

它不会将数字存储为文本,ServiceStack.Text中的实际行为:

public class HasOffset
{
    public int Offset { get; set; }
}

var dto = new HasOffset { Offset = 1 };
string json = dto.ToJson();
json.Print(); //prints {"Offset":1}

var fromJson = json.FromJson<HasOffset>();
Assert.That(fromJson.Offset, Is.EqualTo(1));

如果您尝试使用JsonObject对其进行反序列化,则会将其解析为Dictionary<string,string>字典,并将其强制转换为字符串。同样,如果您尝试将其存储到object中,则序列化程序不知道它应该将其转换为什么类型,因此它将其保留为字符串。

答案 1 :(得分:1)

目前你只能在ServiceStack的JsonSerializer和内置的JsonDataContractSerializer之间切换,你可以把它添加到AppHost.Configure部分:

SetConfig(new EndpointHostConfig {
    UseBclJsonSerializers = true
});

请参阅this主题以获取上述信息的参考。

看起来他们根本不支持不同序列化程序的开箱即用可配置选项。