为什么在调用JValue.ToString()和JValue.ToString(Formatting.None)时会得到不同的结果?

时间:2016-06-30 10:57:28

标签: c# json.net

使用Newtonsoft.Json的示例代码:

JValue v = new JValue("abc");
var vString = v.ToString();  // <= returns "abc"
var vStringWithFormatting = v.ToString(Formatting.None); // returns "\"abc\""

v.ToString()按照我的预期返回字符串。 v.ToString(Formatting.None)返回它,并在其周围加上双引号。为什么呢?

我查看了Github上的Newtonsoft.Json代码,发现了这个:

  • JToken 实现 ToString() ToString(格式化) ToString()在内部调用 ToString(Formatting.Indented),所以我希望这两个应该返回相同的结果。两者似乎都返回“\”abc \“”。
  • JValue 会覆盖 ToString()并返回“abc”。但 覆盖 ToString(格式化)。所以后者采用 JToken 的实现并返回“\”abc \“”。

那会发生什么?

背景:我正在研究一些处理不同类型JSON对象的相当通用的代码。我有一个JProperty的值,可以是JValueJArrayJObject。我需要它的字符串表示,所以我在它上面使用.ToString()。最近我决定使用紧凑表示,所以我将其更改为.ToString(Formatting.None),突然我的测试失败了。现在,我必须为JValue添加类型检查,然后使用ToString()

1 个答案:

答案 0 :(得分:0)

我试图理解界面提供的行为,而不是你所咨询的实际实现。您(当然)可以在开源时执行此操作,但依赖于一种方法的特定实现,因为这些详细的知识对我来说听起来不对。

v.ToString()绑定到 JValue 的方法

public override string ToString();

让我们看看:如果我想使用解析的JSON中的字符串值而不是C#中需要的C#字符串,对吧? C#-string读取“abc”,而不是“\”abc \“”。因此,它对我来说符合预期(和设计)。

v.ToString(Formatting.None)

绑定到 JValue

public string ToString(Formatting formatting, params JsonConverter[] converters);

在我的版本(Json.Net 9 beta)中,第二种方法返回用引号括起来的字符串,无论格式 Formatting.Indented 还是 Formatting.None

让我们看看这是否有意义:如果我担心格式化(括号/逗号和缩进之前和之后的换行符),我可能会将一些JSON代码写入一个意图由人类或以后用任何语言解析,例如JS或C#,或者在这个上下文中由Json.Net做某事

var abc = JValue.Parse("\"abc\"");

(在文件中显示为“abc”)。因此,带有Formatting参数的第二个 ToString 方法用于不同的目的。并再次:它按预期(和设计)imho工作。