使用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代码,发现了这个:
那会发生什么?
背景:我正在研究一些处理不同类型JSON
对象的相当通用的代码。我有一个JProperty
的值,可以是JValue
,JArray
或JObject
。我需要它的字符串表示,所以我在它上面使用.ToString()
。最近我决定使用紧凑表示,所以我将其更改为.ToString(Formatting.None)
,突然我的测试失败了。现在,我必须为JValue
添加类型检查,然后使用ToString()
。
答案 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工作。