为什么我在调用JValue.ToString()和JValue.ToString(Formatting.None)时得到
本文关键字:ToString JValue None Formatting 为什么 调用 | 更新日期: 2023-09-27 17:53:49
使用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上找到Json代码,发现如下:
- JToken实现了ToString()和ToString(Formatting)。ToString()内部调用ToString(formatting . inentation),所以我期望这两个应该返回相同的结果。两者似乎都返回"'"abc'"。
- JValue覆盖ToString()并返回"abc"。但是不是覆盖ToString(Formatting)。因此,后者采用JToken的实现并返回"'"abc'"。
这是应该发生的吗?
背景:我正在研究一些相当通用的代码,处理不同类型的JSON
对象。在某一点上,我有一个JProperty
的值,它可以是JValue
, JArray
或JObject
。我需要它的字符串表示,所以我使用.ToString()
。最近我决定使用紧凑表示,所以我将其更改为.ToString(Formatting.None)
,突然我的测试失败了。现在我必须为JValue
添加类型检查,并使用ToString()
代替。
我试图理解接口提供的行为,而不是您所参考的实际实现。当然,你可以在开源时代做到这一点,但依赖于一种方法的特定实现,因为这些详细的知识对我来说是不对的。
v.ToString () 与 JValue
的方法public override string ToString();
让我们看看:如果我想从解析JSON中使用字符串值,那么我需要在c#中使用c#字符串,对吗?c#字符串读的是"abc",而不是"'"abc'"。因此,对我来说,它的工作方式与预期(和设计)一致。
v.ToString(Formatting.None)
绑定到JValue s
public string ToString(Formatting formatting, params JsonConverter[] converters);
在我的版本(Json。Net 9 beta)第二个方法返回用引号括起来的字符串,无论Formatting是否为Formatting。缩进或格式化。无.
让我们看看这是否有意义:如果我关心格式(括号/逗号之前和之后的换行符和缩进),我可能会将一些JSON代码编写到一个流中,该流意味着由人类读取或通过任何语言解析,例如JS或c#或在此上下文中通过JSON。网做某事如
var abc = JValue.Parse("'"abc'"");
(在文件中显示为"abc")。因此,第二个带有Formatting参数的ToString方法具有不同的用途。再一次,它的工作原理和预期一样(和设计一样)。