gpt4 book ai didi

c# - Newtonsoft Json 序列化条件序列化意外启动

转载 作者:行者123 更新时间:2023-11-30 12:28:18 25 4
gpt4 key购买 nike

我遇到了 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 ) 的任何地方找到这个记录,也没有任何谷歌搜索显示此行为的其他命中。

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

最佳答案

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

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 的表现不错。

关于c# - Newtonsoft Json 序列化条件序列化意外启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22335241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com