【问题标题】:Is there a way to make ServiceStack.Redis use JSON.NET instead of ServiceStack.Text?有没有办法让 ServiceStack.Redis 使用 JSON.NET 而不是 ServiceStack.Text?
【发布时间】:2014-06-07 07:23:36
【问题描述】:

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

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

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

在我们的具体案例中,JSON.NET 将数据存储为
“偏移”:0
和 ServiceStack.Text 将数据存储为
“偏移”:“0”

为什么这很糟糕?在 javascript 中,29 + 0 = 29 但 29 + '0' = '290'。这意味着 array[29 + offset] 可以使用 ServiceStack.Text 产生奇怪的结果

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

【问题讨论】:

  • 这很有趣……你是从 C# 对象序列化到 redis 吗?这似乎是在序列化到 Redis 期间对您的原生类型的误解。
  • 我依靠 ServiceStack.Redis 来序列化对象,它依靠 ServiceStack.Text 来进行实际的转换。 ServiceStack.Text 的行为不如预期,所以我想知道是否可以告诉 ServiceStack 使用经过验证的 JSON.NET(这是最流行的 nuget 包之一)
  • 即使在 servicestack 源代码中修复了这个错误,但它首先存在的事实让我有足够的时间不信任 servicestack.text 而不是 json.net。
  • 实际用例是这样的:C# 字典(字符串键、对象值)被转换为 JSON。 ServiceStack.Text 将整数存储为字符串。 JSON.NET 将整数存储为整数。
  • 这可能是你的问题。通过使用对象值,ServiceStack 文本正在做出假设。有什么方法可以在序列化之前转换为正确的类型?

标签: c# javascript json redis servicestack


【解决方案1】:

它不将数字存储为文本,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&lt;string,string&gt; 字典,它会被强制转换为字符串。同样,如果您尝试将其存储到 object 中,则序列化程序不知道应将其转换为哪种类型,因此将其保留为字符串。

【讨论】:

  • 没想到得到mythz本人的答复!我的具体用例是一个由字符串键入的对象字典。如果该字典中的一项是 int ,它将被存储为字符串。既然是你花时间回复,我会尊重这一点,并提供一个代码示例来说明这种情况发生的位置(尽管可能需要一两天)。正是这个特定的用例导致了问题。
【解决方案2】:

目前您只能在 ServiceStack 的 JsonSerializer 和内置的 JsonDataContractSerializer 之间切换,您可以通过将其添加到 AppHost.Configure 部分来实现:

SetConfig(new EndpointHostConfig {
    UseBclJsonSerializers = true
});

请参阅this线程以获取上述信息的参考。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 2019-02-27
    • 2011-05-04
    • 2015-11-09
    • 1970-01-01
    相关资源
    最近更新 更多