是否可以使ServiceStack Json序列化程序序列化标记为JsonIgnore的属性

时间:2014-08-15 10:14:40

标签: .net serialization json.net servicestack-text servicestack.redis

我们有一个应用程序,我们正在使用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的情况下忽略某些属性?

1 个答案:

答案 0 :(得分:4)

虽然我不建议依赖序列化程序之间的不同行为,但我只是added a commit可以让您更改用于忽略属性的属性。即,您可以删除[JsonIgnore]属性:

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

这可以从 v4.0.31 + 获得,现在是available on MyGet