Newtonsoft.Json在序列化数组时,在中间添加省略号(...)。

7
这是一个关于Newtonsoft.Json序列化功能的非常奇怪的行为。我已经尝试了几乎所有方法(例如,我没有使用.NET反编译器逐步遍历Newtonsoft.Json.dll程序集的算法)。

症状

情况如下:

我有一个小的POCO类,包含4个字符串属性:

public class MyPoco {
    public string op { get; set; }
    public string left { get; set; }
    public string right { get; set; }
    public string result { get; set; }
}

我创建了一个包含618个 MyPoco 实例的数组:enter image description here 结果的 json 总是被省略号中断: enter image description here 结果字符串的确切构成如下:
  • 字符串的第一部分是前156个 MyPoco 实例的成功序列化。
  • 字符串的第二部分是三个点(这也破坏了 Json 语法 - 实际上这是一件好事),后面跟着索引为466的最后半部分 MyPoco 实例。
  • 字符串的第三部分是最后152个 MyPoco 实例的成功序列化。
因此,总的来说:
  • Newtonsoft.Json 成功地序列化了数组的前156个项目(从索引0到155)。
  • 它还成功地序列化了最后152个项目(从索引467到617)。
  • 它也成功地在生成的字符串开头和结尾处写入了表示数组的方括号。
  • 在该字符串的中心位置,它添加了一个省略号,将字符串切成两半,在出现大约15,000个“健康”字符之后,再跟着15,000个“健康”的字符。

问题

我不知道该怎么办。我可以继续使用 JavaScriptSerializer,但我不想失去对 Newtonsoft.Json 的信任。
这是主要问题。
感觉应该会崩溃并抛出全面的异常,但它却默默地失败了,这可能会在生产应用程序中引起严重的问题。
我已经到处寻找类似 "Max Buffer Size" 的设置,但除了已经臭名昭著的 "Max Depth" 设置外,什么也没有找到,而这里并不适用,因为我有一个3层树(最深层是原始字符串)。
有人曾经遇到过 Newtonsoft.Json 的这种奇怪行为吗?

更多信息

我使用了8.0.2和7.0.1 Nuget包版本(跳过了8.0.1)。 两个版本都表现出相同的症状。
我针对 .NET 4.6,我们正在谈论一个空的控制台应用程序(我尽可能地复制了这些症状)。
这是在Visual Studio调试器中看到的省略号的快照: enter image description here

我本来想说我已经试过了,但是没有发现任何问题,但我确实能够重现这个问题。这真的很奇怪... - Anderson Pimentel
嗨@AndersonPimentel!不幸的是,情况并非如此。请查看最新的EDIT以获取屏幕截图。我实际上没有进行任何文件系统操作,只是将调试器中的内容复制到Sublime中以更好地检查情况。但是,你无法复制问题是个好消息。 - Eduard Dumitru
刚刚编辑了我的评论。我能够重现它。这真的很奇怪! - Anderson Pimentel
是的,确实如此。此外,您可以测试的是:找到奇怪现象消失的极限。它应该是成功序列化的第一部分的两倍。就字符串而言,而不是实例,以及在UTF8常规拉丁字母表中,它应该是30 KB的数据。再加上数组中的一个实例,奇怪现象就会再次出现。有人请@JamesNewton-King来这里:)。请帮忙! - Eduard Dumitru
1个回答

6

好消息!看起来一切都没有问题。

如果您和我做的一样,正在检查json变量,然后复制其内容并将其粘贴到其他地方进行验证。

问题在于:Visual Studio正在获取开头并添加省略号,然后获取内容的结尾。

如果您将其写入文件,则是完整且有效的JSON!

var lines = new MyPoco[6000];

for (int i = 0; i < lines.Length; i++)
{
    lines[i] = new MyPoco
    {
        op = "Concatenate" + i,
        left = "Integer",
        right = "String",
        result = "String",
    };
}

var json = JsonConvert.SerializeObject(lines, Formatting.Indented);
File.WriteAllText("JsonNet.json", json);

var json2 = new JavaScriptSerializer().Serialize(lines);
File.WriteAllText("JavaScriptSerializer.json", json2);

希望能帮到你!

哦,谢谢你!我猜我毕竟还没有尝试过所有的方法 :) - Eduard Dumitru
赶上我了!我刚试着重新创建它,写入文件没有任何问题。 - terbubbs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接