【问题标题】:Newtonsoft Json Serialization Conditional Serialization Kicking in UnexpectedlyNewtonsoft Json 序列化条件序列化意外启动
【发布时间】:2014-03-11 19:53:43
【问题描述】:

我遇到了一个奇怪的问题,Newtonsoft Json 条件序列化意外启动。我把它提炼成一个简单的例子(我们使用的是 newtonsoft json 5.0.8):

public class TestClass
{
    public string Foo { get; set; }
    public bool FooSpecified { get; set; }
    public TestClass()
    { }
    public TestClass(string foo, bool spec)
    {
        Foo = foo;
        FooSpecified = spec;
    }
}

class Program
{
    static void Main(string[] args)
    {
        TestClass test1 = new TestClass("foo", false);
        string serial1 = JsonConvert.SerializeObject(test1);
        Console.WriteLine("Test 1: {0}", serial1);

        TestClass test2 = new TestClass("bar", true);
        string serial2 = JsonConvert.SerializeObject(test2);
        Console.WriteLine("Test 2: {0}", serial2);
    }
}

上面的输出:

Test 1: {"FooSpecified":false}
Test 2: {"Foo":"bar","FooSpecified":true}

似乎有一个名为“xSpecified”的布尔属性,其中“x”与另一个属性的名称匹配,这相当于条件序列化。我在 Newtonsoft json 条件序列化文档 (http://james.newtonking.com/json/help/index.html?topic=html/ConditionalProperties.htm) 的任何地方都没有发现这一点,也没有任何谷歌搜索显示此行为的其他命中。

有谁知道这是预期的行为还是我遇到了某种错误?

【问题讨论】:

标签: c# json serialization json.net


【解决方案1】:

我不认为这是一个错误。要么你没有找到正确的文档,要么它没有记录,但我不会称之为错误。只是为了仔细检查我使用以下代码产生类似结果的行为。

TestClass test1 = new TestClass("foo", false);
string serial1 = JsonConvert.SerializeObject(test1);
test1.FooSpecified = true;
string serial3 = JsonConvert.SerializeObject(test1);
Console.WriteLine("Test 1: {0}", serial1);
Console.WriteLine("Test 1: {0}", serial3);

经过一些研究,我发现添加它可能是为了与 XmlSerializer 实现对等,后者使用 propertyNameSpecified 模式实现相同目的。这是我从 JNK 那里找到的最后一条评论,但是,他一定改变了主意,因为很明显,它已经实现了。

http://json.codeplex.com/workitem/19091

编辑:从 LB 的评论中添加源链接,清楚地表明它是有意实施的; https://github.com/ayoung/Newtonsoft.Json/blob/master/Newtonsoft.Json/Serialization/JsonTypeReflector.cs

此外,如果您阅读该 codeplex 链接上的完整 cmets,您会发现完整的故事。 JNK 表示他不会实施它,但如果其他人实施了它会添加它。最后的评论是有人说他们已经做到了。我会假设 JNK 在他的最后做得很好。

【讨论】:

  • 谢谢埃文;那不是错误。我确实从 JNK 的评论中笑了出来:“我认为属性的名称比 ShouldSerialize 命名模式更容易意外绊倒某人”,这正是有人在我们的代码库中添加新成员并破坏序列化时发生的情况. :)
猜你喜欢
  • 2019-12-20
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多