【问题标题】:JToken.ToString() removing curly bracesJToken.ToString() 删除花括号
【发布时间】:2014-10-21 00:13:13
【问题描述】:

我有以下JToken

{
    "ID": "9dbefe3f5424d972e040007f010038f2"
}

但每当我在 JToken 对象上运行 ToString() 以获取字符串形式的底层 JSON 时,它都会返回:

\"ID\": \"9dbefe3f5424d972e040007f010038f2\"

转义引号是预期的,但为什么要删除花括号?这是有效的 JSON。这似乎只在某些情况下发生,因为我能够成功运行 ToString() 并且在其他(更复杂的)JTokens 上保持花括号完好无损。

【问题讨论】:

  • 1) 引号的转义是由 Visual Studio 在 GUI 中显示字符串时完成的。要在不转义的情况下查看字符串,请在即时窗口中键入 System.Diagnostics.Debug.WriteLine(token.ToString())。 2) 你在使用什么库——Json.NET? 3) 可以提供minimal, complete, and verifiable example的问题吗?
  • 无法复制。在即时窗口中,输入Debug.WriteLine(JObject.Parse("{\"ID\": \"9dbefe3f5424d972e040007f010038f2\"}").ToString()) 会返回{ "ID": "9dbefe3f5424d972e040007f010038f2" }

标签: c# asp.net json json.net


【解决方案1】:

ToString() 返回JToken 内容的 JSON 表示。 JToken 是一个抽象类,所以返回什么 JSON 取决于它是什么类型的 JToken(以及它包含的内容)。

这里有一个简短的例子来说明这一点:

class Program
{
    static void Main(string[] args)
    {
        JObject jo = new JObject();
        jo.Add("ID", "9dbefe3f5424d972e040007f010038f2");

        // token is a JObject
        DumpToken(jo);

        // token is a JProperty (the first property of the JObject)
        DumpToken(jo.Properties().First());

        // token is a JValue (the value of the "ID" property in the JObject)
        DumpToken(jo["ID"]);  
    }

    private static void DumpToken(JToken token)
    {
        Console.WriteLine(token.GetType().Name);
        Console.WriteLine(token.ToString());
        Console.WriteLine();
    }
}

输出:

JObject
{
  "ID": "9dbefe3f5424d972e040007f010038f2"
}

JProperty
"ID": "9dbefe3f5424d972e040007f010038f2"

JValue
9dbefe3f5424d972e040007f010038f2

因此,我怀疑当您从 ToString() 获取裸名称-值对时,您的代码中引用了 JProperty,而不是 JObject。当您在 JObjectJArray 上调用 ToString() 时,您应该只期望获得完整(有效)的 JSON。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 2019-07-15
    相关资源
    最近更新 更多