JSON数据中的“<”字符被序列化为\u003c。

10

我有一个JSON对象,其中一个元素的值是一个字符串。在这个字符串中有字符"<RPC>"。我将整个JSON对象带到ASP.NET服务器端代码中,然后执行以下操作将名为rpc_response的对象添加到POST响应数据中:

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
HttpContext.Current.Response.AddHeader("Pragma", "no-cache");
HttpContext.Current.Response.AddHeader("Cache-Control", "private, no-cache");
HttpContext.Current.Response.AddHeader("Content-Disposition", "inline; filename=\"files.json\"");
HttpContext.Current.Response.Write(serializer.Serialize(rpc_response));
HttpContext.Current.Response.ContentType = "application/json";
HttpContext.Current.Response.StatusCode = 200;

在对象被序列化后,我在另一端(不是web浏览器)接收到它,这个特定的字符串看起来像:\u003cRPC\u003e

我该怎么做才能防止这些(和其他)字符没有被正确编码,同时仍然能够序列化我的JSON对象?

1个回答

12

这些字符被“正确地”编码了!1使用一个有效的JSON库来正确访问JSON数据——它是一个有效的JSON编码。

转义这些字符可以防止通过JSON进行HTML注入,并使JSON符合XML标准。也就是说,即使JSON直接被发射到JavaScript中(因为JSON是JavaScript的一个有效2子集,所以经常这样做),它也不能用于提前终止<script>元素,因为相关字符(例如<>)在JSON本身中被编码了。

标准的JavaScriptSerializer不具备更改此行为的能力。这种转义可能在Json.NET实现中是可配置(或不同的),但这并不重要,因为有效的JSON客户端/库必须理解\u转义。


1 来自RFC 4627:JavaScript对象表示法(JSON)的应用程序/ json媒体类型

任何字符都可以转义。 如果该字符位于基本多文种平面(U + 0000至U + FFFF)中,则可以表示为六个字符序列:反斜杠,后跟小写字母u,后跟编码字符代码点的四个十六进制数字。

另请参见C#将Facebook响应转换为适当编码字符串(这也与JSON转义相关)。

2一种罕见情况不符合此要求,但忽略(或考虑)该情况。


我遇到了相反的问题。我喜欢 JavaScriptSerializer 转义 < 和 > 的方式,但当我切换到 Json.NET 时,它不会转义这些字符,导致在将 Json 注入我的页面时出现错误,并且当浏览器在我的 json 字符串中看到 </script> 时会感到困惑。有什么办法可以让 Json.NET 正确转义吗? - Brobic Vripiat

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