Newtonsoft Json 序列化 条件序列化意外启动
本文关键字:序列化 启动 意外 条件 Newtonsoft Json | 更新日期: 2023-09-27 17:49:45
我遇到了一个奇怪的问题,Newtonsoft Json条件序列化意外启动。 我把它提炼成一个简单的例子(我们使用牛顿软件 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}
似乎具有一个名为"xSpecific"的布尔属性,其中"x"与另一个属性的名称匹配,则充当条件序列化。 我没有在Newtonsoft json条件序列化文档(http://james.newtonking.com/json/help/index.html?topic=html/ConditionalProperties.htm(的任何地方找到记录,也没有任何谷歌搜索显示此行为的其他命中率。
有谁知道这是预期的行为还是我遇到了某种错误?
我不相信这是一个错误。要么你没有找到正确的文档,要么它没有记录,但我不会称之为错误。只是为了仔细检查行为,我使用以下代码来产生类似的结果。
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);
经过一番研究,我发现添加它可能是为了与使用这种propertyNameSpecified
模式的XmlSerializer
实现对等。这是我从JNK那里找到的最后一条评论,但是,他一定改变了主意,因为很明显,它已经实施。
http://json.codeplex.com/workitem/19091
编辑:从LB的评论中添加源链接,清楚地表明它是故意实施的; https://github.com/ayoung/Newtonsoft.Json/blob/master/Newtonsoft.Json/Serialization/JsonTypeReflector.cs
此外,如果您阅读该代码复合链接的完整评论,您将找到完整的故事。JNK表示他不会实施它,但如果其他人这样做,他会添加它。最后的评论是有人说他们已经做到了。我认为JNK在他的结局中取得了成功。