这是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)
结果字符串的确切解剖结构如下:
MyPoco实例的成功序列化MyPoco实例的后半部分,基于0的索引是466MyPoco实例的成功序列化所以基本上,把它包起来:
Newtonsoft.Json 成功序列化我的数组的前156项(索引0到155)我不知道该怎么办.我可以继续使用,JavaScriptSerializer但我不想失去信任Newtonsoft.Json.
这是主要问题.
感觉它应该是一个全面的异常崩溃,但它却默默地失败,这可能会给生产应用程序带来严重的复杂性.
我到处寻找"最大缓冲区大小"之类的设置,找不到比已经臭名昭着的"Max Depth"设置更多的东西,因为我有一个3层树(最深层有原始字符串),因此不是这里的情况).
有没有人经历过如此奇怪的行为Newtonsoft.Json?
我使用了8.0.2和7.0.1 Nuget包版本(我跳过了8.0.1).两个版本都表现出相同的症状.
我的目标是.NET 4.6,我们谈论的是一个空的控制台应用程序(我以最干净的方式复制了症状).
以下是Visual Studio调试器中右侧所示省略号的快照:
好消息!似乎毕竟没有问题.
如果你和我一样,你正在检查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)
希望能帮助到你!