gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:18:21 26 4
gpt4 key购买 nike

使用 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(Formatting)ToString() 在内部调用 ToString(Formatting.Indented),所以我希望这两个应该返回相同的结果。两者似乎都返回“\”abc\“”。
  • JValue 覆盖 ToString() 并返回“abc”。但它不会覆盖ToString(Formatting)。所以后者采用JToken的实现,返回“\”abc\”。

这是应该发生的事情吗?

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

最佳答案

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

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

public override string ToString();

让我们看看:如果我想使用来自已解析 JSON 的字符串值,而不是我在 C# 中需要的是 C# 字符串,对吗? C# 字符串读作“abc”,而不是“\"abc\"”。因此,它对我来说按预期(和设计)工作。

v.ToString(Formatting.None)

绑定(bind)到 JValue

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

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

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

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

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

关于c# - 为什么在调用 JValue.ToString() 和 JValue.ToString(Formatting.None) 时会得到不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38121117/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com