c# – Newtonsoft Json序列化条件序列化意外地开始

我遇到了一个奇怪的问题,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’的bool属性,其中’x’与另一个属性的名称匹配,作为条件序列化.我没有在Newtonsoft json条件序列化文档(http://james.newtonking.com/json/help/index.html?topic=html/ConditionalProperties.htm)中找到任何记录,也没有任何谷歌搜索显示此行为的其他命中.

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

最佳答案 我不相信这是一个错误.要么你找不到合适的文档,要么没有文档,但我不会把它称为bug.只是为了仔细检查我使用以下代码产生类似结果的行为.

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链接的完整评论,您将找到完整的故事. JNK说他不会实施它,但如果其他人这样做的话就会添加它.最后的评论是有人说他们已经做到了.我认为JNK在他的结局上做得很好.

点赞