我遇到了一个奇怪的问题,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在他的结局上做得很好.