Newtonsoft.Json在序列化数组的中间添加了省略号(...)

Edu*_*tru 7 .net c# json.net

这是Newtonsoft.Json序列化功能的一种非常奇怪的行为.我已经尝试了几乎所有的东西(例如我没有继续使用.NET Reflector逐步完成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; }
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个包含618个MyPoco实例的数组: 在此输入图像描述

生成的json总是在中间用省略号打破: 在此输入图像描述

结果字符串的确切解剖结构如下:

  • 字符串的第一部分是前156个MyPoco实例的成功序列化
  • 字符串的第二部分实际上是3个点(这也打破了Json语法 - 这实际上是一件好事)然后是MyPoco实例的后半部分,基于0的索引是466
  • 字符串的第三部分是最后152个MyPoco实例的成功序列化

所以基本上,把它包起来:

  • Newtonsoft.Json 成功序列化我的数组的前156项(索引0到155)
  • 它还成功序列化了最后152个项目(索引467到617)
  • 它还成功地在结果字符串的开头和结尾处写入开始和结束方括号(表示数组)
  • 在这个字符串的正中间,它添加了省略号,将字符串缩减了一半,之后看起来是15,000个"健康"字符的领先群体,并且在15,000个"健康"字符的尾随之前

问题

我不知道该怎么办.我可以继续使用,JavaScriptSerializer但我不想失去信任Newtonsoft.Json.

这是主要问题.

感觉它应该是一个全面的异常崩溃,但它却默默地失败,这可能会给生产应用程序带来严重的复杂性.

我到处寻找"最大缓冲区大小"之类的设置,找不到比已经臭名昭着的"Max Depth"设置更多的东西,因为我有一个3层树(最深层有原始字符串),因此不是这里的情况).

有没有人经历过如此奇怪的行为Newtonsoft.Json?

更多的信息

我使用了8.0.2和7.0.1 Nuget包版本(我跳过了8.0.1).两个版本都表现出相同的症状.

我的目标是.NET 4.6,我们谈论的是一个空的控制台应用程序(我以最干净的方式复制了症状).

编辑#1

以下是Visual Studio调试器中右侧所示省略号的快照:

在此输入图像描述

And*_*tel 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);
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!