为什么我在调用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, JArrayJObject。我需要它的字符串表示,所以我使用.ToString()。最近我决定使用紧凑表示,所以我将其更改为.ToString(Formatting.None),突然我的测试失败了。现在我必须为JValue添加类型检查,并使用ToString()代替。

为什么我在调用JValue.ToString()和JValue.ToString(Formatting.None)时得到

我试图理解接口提供的行为,而不是您所参考的实际实现。当然,你可以在开源时代做到这一点,但依赖于一种方法的特定实现,因为这些详细的知识对我来说是不对的。

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方法具有不同的用途。再一次,它的工作原理和预期一样(和设计一样)。