问题描述 投票:5回答:1

我有一个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对象?

asp.net json serialization encoding javascriptserializer
1个回答
7
投票

字符正在“正确”编码!1使用正常工作的JSON库来正确访问JSON数据 - 它是一个有效的JSON编码。

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

标准的JavaScriptSerializer无法改变这种行为。这种转义可能在Json.NET实现中是可配置的(或不同的) - 但是,它应该无关紧要,因为有效的JSON客户端/库必须理解\u转义。


1来自RFC 4627: The application/json Media Type for JavaScript Object Notation (JSON)

任何角色都可能被转义。如果字符在基本多语言平面(U + 0000到U + FFFF)中,那么它可以表示为六个字符的序列:反向固相,后跟小写字母u,后跟四个十六进制数字,编码角色的代码点..

另请参见C# To transform Facebook Response to proper encoded string(这也与JSON转义有关)。

2有a rare case when this does not hold,但忽略(或说明)..

© www.soinside.com 2019 - 2024. All rights reserved.