我们有一个应用程序,我们正在使用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(https://github.com/ServiceStack/ServiceStack.Text/pull/420)中的JsonIgnore属性。
所以,如果我们有班级
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" }
但现在我们失去了Bar并且只获得了
{ "Foo": "A" }
有没有办法让ServiceStack序列化用JsonIgnore标记的属性,或者我们是否需要回到之前的版本(可能永远停留在以前的版本上)?
或者,是否有一种很好的方法可以让JSON.NET在不使用JsonIgnore的情况下忽略某些属性?
答案 0 :(得分:4)
虽然我不建议依赖序列化程序之间的不同行为,但我只是added a commit可以让您更改用于忽略属性的属性。即,您可以删除[JsonIgnore]
属性:
JsConfig.IgnoreAttributesNamed = new[] {
typeof(IgnoreDataMemberAttribute).Name //i.e. Remove [JsonIgnore]
};
这可以从 v4.0.31 + 获得,现在是available on MyGet。