Json.NET在返回JSON序列化字符串时添加反斜杠

22

我试图使用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 解析失败的字符。


3
这很奇怪,对我来说这些反斜杠看起来只是普通的转义字符。请记住,如果您在调试器中检查此函数的返回值,它将保留这些转义字符,而实际字符串的值则不包含它们。 - Timothy Groote
1
但是,当从客户端消耗Json时,反斜杠会导致各种问题。 - Soham Dasgupta
1
但是当我从Google Chrome访问服务端点时,这就是返回给我的内容。如果您考虑到JSON中的字符串,也可以作为字符串返回。 - Soham Dasgupta
1
.Books.ToList() 可能有点过了,.Books 99% 足够了。 - xanatos
4
你是否使用Web API?如果是,那么你不需要调用JsonConvert.SerializeObject()方法。Web API会为你序列化这个对象。请参见此问题。 - Brian Rogers
显示剩余4条评论
4个回答

21

不,它不会。

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,因此需要对所有内容进行转义。


2
我使用了 文本可视化器,它正确显示了,但我猜测Google Chrome正在格式化JSON并放入转义字符。但在IE中,我被要求将JSON保存为文件,并在打开后仍然看到引号。 - Soham Dasgupta
2
@SohamDasgupta 如我所说,可能是链上的一个调用方法重新将其转换为 JSON。 - xanatos
@xanatos 我同意“重新 JSON 化”它。在 WebAPI 项目中,我只是返回了 x.ToList(),方法本身就将结果转换为 JSON 格式。感谢您的回答。 - Sincere

4
string str = "Your string with slashes";

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

3

JSON对象被序列化两次。

我通过以下方式解决:

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

JSON的序列化将在后台自动完成。


0
我在进行一些 JSON 序列化的单元测试时,得到了相同的结果,但转义斜杠翻倍了。看着我的代码,我意识到我正在序列化“期望”的 JSON 字符串,而不是实际的 .net 对象。因此,将一个 json 字符串传递给 JsonConvert.SerializeObject(expectedJsonString) 将简单地对其进行一次转义。这就是我来到这里的方式,也是我意识到我犯了一个编码错误时写下的答案...你刚刚意识到你自己的编码错误了吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接