【问题标题】:Is it possible to make the ServiceStack Json serializer serialize properties marked with JsonIgnore是否可以使 ServiceStack Json 序列化程序序列化标有 JsonIgnore 的属性
【发布时间】:2014-08-15 10:14:40
【问题描述】:

我们有一个应用程序,我们正在使用 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 序列化程序的行为以尊重 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" }

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

{ "Foo": "A" }

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 太好了,为我们解决了问题!但如果我可以这么说,我认为 ServiceStack.Text 中的 Json 序列化程序使用 Json.NET 中的 JsonIgnore 属性作为默认设置是错误的。虽然我同意它在某些情况下可能有用,但如果选择加入它会更有意义。您可以轻松地反转刚刚添加的代码,而是使用 JsConfig.UseIgnoreAttributesNamed 或类似的东西。这也使得它可以与除 Json.NET 之外的其他序列化程序兼容。
    • @JohanDriessen 该属性是[JsonIgnore] 而不是[JsonNetIgnore] 如果您在模型上看到这些属性,在没有任何外部知识的情况下,自然会假定它是所选 JSON 序列化程序忽略该属性的指令.将其作为默认值内置有助于提高可移植性,但代价是我不推荐这种特定场景,因为它不鼓励“成功的深渊”开发,并且将来可能会绊倒其他人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 2017-01-08
    • 1970-01-01
    相关资源
    最近更新 更多