【问题标题】:Json.NET adding backslash while returning json serialized stringJson.NET 在返回 json 序列化字符串时添加反斜杠
【发布时间】:2013-08-14 07:45:18
【问题描述】:

我正在尝试使用 Json.NET 将列表序列化为 json 字符串,但返回字符串中包含反斜杠,这反过来又导致 json 解析失败。

var x = from d in entities.Books.ToList()
        select new
        {
            ID = d.ID,
            BookName = d.BookName
        };
return JsonConvert.SerializeObject(x.ToList());

以上代码返回

"[{\"ID\":1,\"BookName\":\"MVC Music Store - Tutorial - v3.0\"},{\"ID\":2,\"BookName\":\"Pro.ASP.NET.MVC.3.Framework\"},{\"ID\":3,\"BookName\":\"Application Architecture Guide v2\"},{\"ID\":4,\"BookName\":\"Gang of Four Design Patterns\"},{\"ID\":5,\"BookName\":\"CS4 Pocket Reference\"}]"

这会导致所有 JSON 解析失败。我怎样才能删除这些。

【问题讨论】:

  • 这很奇怪,那些反斜杠对我来说就像普通的转义字符。请记住,如果您在调试器中检查此函数的返回值,它将保留那些转义字符,而字符串的实际值没有它们。
  • 但是从客户端使用 Json 时,反斜杠会导致各种问题。
  • 但是当我从谷歌浏览器访问服务端点时,这就是返回给我的内容。如果您考虑包含 JSON 的字符串,也可以作为字符串。
  • .Books.ToList() 可能太多了。 .Books 99% 就够了。
  • 您在使用 Web API 吗?如果是这样,您不需要调用 JsonConvert.SerializeObject()。 Web API 为您序列化对象。见this question

标签: c# .net json .net-4.0 json.net


【解决方案1】:

没有。它没有

class Program
{
    class Book
    {
        public int ID;
        public string BookName;
    }

    static void Main()
    {
        var books = new List<Book> { new Book { ID = 1, BookName = "A" }, new Book { ID = 2, BookName = "B" } };

        var x = from d in books
        select new
        {
            ID = d.ID,
            BookName = d.BookName
        };

        string str = JsonConvert.SerializeObject(x.ToList());
        Console.WriteLine(str);
    }
}

可能有两个问题:

A) 您正在查看调试器的结果。要检查这一点,请将JsonConvert 放在一个临时变量中(就像我所做的那样)并使用调试器查看它。点击沙漏右侧的箭头并选择Text Visualizer

B) 调用方法正在将对象再次转换为 Json,从而转义所有内容。

【讨论】:

  • 我使用 Text Visualizer 正确显示它,但我猜谷歌浏览器正在格式化 json 并放入转义字符。但在 IE 中,我被要求将 json 保存为文件,打开它后我仍然看到引号。
  • @SohamDasgupta 正如我所说的,也许链上调用方法之一是重新 json-ing 它。
  • @xanatos 我同意“re-json-ing”它。我只是在 WebAPI 项目中返回了x.ToList()json 方法本身就生成了结果。感谢您的回答
【解决方案2】:
string str = "Your string with slashes";

str = JToken.Parse({your string here}).ToString();

【讨论】:

    【解决方案3】:

    JSON 对象被序列化两次。

    我解决了:

    声明方法响应格式的操作契约返回JSON。 我更改了返回对象而不是字符串的方法。

    Jason 的序列化将在幕后自动完成。

    【讨论】:

      【解决方案4】:

      我得到了相同的结果,但是在我对一些 json 序列化进行单元测试时,转义阴影加倍。查看我的代码,我意识到我正在序列化“预期”的 json 字符串,而不是实际的 .net 对象。因此,将一个 json 字符串传递给 JsonConvert.SerializeObject(expectedJsonString) 只会将其转义一次。这就是我来到这里的原因,这就是我写的答案,当我意识到我只是犯了一个编码错误时......你刚刚意识到你的错误吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-29
        • 2020-11-13
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        相关资源
        最近更新 更多