1

我们有一个应用程序,我们正在使用 ServiceStack.Redis 进行缓存。该应用程序是一个 REST API,我们在其中以 JSON 格式提供响应。我们使用 Newtonsoft JSON.NET 来序列化我们的响应,当然 ServiceStack.Redis 使用 ServiceStack.Text 来序列化/反序列化存储在 Redis 缓存中的数据。

问题是我们想要在缓存中存储比我们提供给客户端更多的数据。因此,我们一直在使用 JSON.NET 中的 [JsonIgnore] 属性标记我们不想向客户端公开的属性。这在 ServiceStack.Redis 4.0.20 中效果很好,但是当我们升级到 4.0.30 时就坏了。似乎他们改变了 Json Serializer 的行为以尊重 JSON.NET 的 JsonIgnore 属性(https://github.com/ServiceStack/ServiceStack.Text/pull/420)。

所以如果我们有课

public class FooBar 
{
    public string Foo { get; set; }

    [JsonIgnore]
    public string Bar { get; set; }
}

并尝试序列化对象

var fooBar = new FooBar { Foo = "A", Bar = "B" }

过去存储在 Redis 中的是

{ "Foo": "A", "Bar": "B" }

但现在我们失去了酒吧,只得到

{ "Foo": "A" }

有什么办法可以让ServiceStack序列化标记有JsonIgnore的属性,还是我们需要回到之前的版本(并且可能永远卡在之前的版本上)?

或者,有没有一种好方法可以让 JSON.NET 在不使用 JsonIgnore 的情况下忽略某些属性?

4

1 回答 1

4

虽然我不建议依赖于序列化程序之间的不同行为,但我刚刚添加了一个提交,允许您更改用于忽略属性的属性。即你可以删除[JsonIgnore]属性:

JsConfig.IgnoreAttributesNamed = new[] {
    typeof(IgnoreDataMemberAttribute).Name //i.e. Remove [JsonIgnore] 
};

这可从v4.0.31+ 开始,现在可在 MyGet 上使用

于 2014-08-18T22:45:21.637 回答