我正在实现一个返回json结果的方法,如:
public JsonResult MethodName(Guid key){
var result = ApiHelper.GetData(key); //Data is stored in db as varchar with åäö
return Json(new { success = true, data = result },"application/json", Encoding.Unicode, JsonRequestBehavior.AllowGet );
}
显示的结果:
{"success":true,"data":[{"Title":"Here could be characters like åäö","Link":"http://www.url.com/test",...},
但我希望将它显示为:
{"success":true,"data":[{"Title":"Here could be characters like \u00e5\u00e4\u00f6","Link":"http:\/\/www.url.com\/test",...},
我怎样才能做到这一点? 我可以转换它,解析它或更改web.config中的responseEncoding以使其显示unicode字符吗?
答案 0 :(得分:4)
如果客户端是Web浏览器或任何其他正确处理http的客户端,只要服务器正确告诉客户端内容类型和内容编码,并且您选择的编码支持代码点,则无需转义在传出的数据中。
如果客户端行为不正确,并且确实需要像这样转义字符串,则必须编写自己的ActionResult
类并自行转义。从JsonResult
开始继承,并使用反射来创建JSON文档。
这是一件苦差事!
编辑:这将帮助您入门
public class MyController : Controller {
public JsonResult MethodName(Guid key){
var result = ApiHelper.GetData(key);
return new EscapedJsonResult(result);
}
}
public class EscapedJsonResult<T> : JsonResult {
public EscapedJsonResult(T data) {
this.Data = data;
this.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
}
public override ExecuteResult(ControllerContext context) {
var response = context.HttpContext.Response;
response.ContentType = "application/json";
response.ContentEncoding = Encoding.UTF8;
var output = new StreamWriter(response.OutputStream);
// TODO: Do some reflection magic to go through all properties
// of the this.Data property and write JSON to the output stream
// using the StreamWriter
// You need to handle arrays, objects, possibly dictionaries, numbers,
// booleans, dates and strings, and possibly some other stuff... All
// by your self!
}
// Finds non-ascii and double quotes
private static Regex nonAsciiCodepoints =
new Regex(@"[""]|[^\x20-\x7f]");
// Call this for encoding string values
private static string encodeStringValue(string value) {
return nonAsciiCodepoints.Replace(value, encodeSingleChar);
}
// Encodes a single character - gets called by Regex.Replace
private static string encodeSingleChar(Match match) {
return "\\u" + char.ConvertToUtf32(match.Value, 0).ToString("x4");
}
}
答案 1 :(得分:0)
有一些逃避的方法,但没有一种方法能够完全符合你的要求(HtmlEncode and UrlEncode)你需要一个用户定义的函数才能逃脱。
答案 2 :(得分:0)
不确定这是否有帮助,但我使用以下行获取unicode字符: System.Web.Script.Serialization.JavaScriptSerializer jsonSerializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 返回Json(jsonSerializer.Serialize(validationResult));