Newtonsoft.Json在序列化数组

时间:2016-01-20 17:56:51

标签: c# .net 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; }
}

我创建了一个包含618个MyPoco个实例的数组: enter image description here

生成的 json 总是在中间用省略号打破: enter image description here

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

  • 字符串的第一部分是前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调试器中的省略号快照:

enter image description here

1 个答案:

答案 0 :(得分: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);

希望它有所帮助!