2012-01-09 25 views
5

Tôi đang thực hiện một phương pháp mà đang trở lại một kết quả json như:Làm thế nào để trả về kết quả json với các ký tự unicode thoát như u1234

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); 
} 

Kết quả hiển thị:

{"success":true,"data":[{"Title":"Here could be characters like åäö","Link":"http://www.url.com/test",...}, 

Nhưng tôi sẽ muốn hiển thị nó như:

{"success":true,"data":[{"Title":"Here could be characters like \u00e5\u00e4\u00f6","Link":"http:\/\/www.url.com\/test",...}, 

Tôi làm cách nào để thực hiện việc này? Tôi có thể chuyển đổi nó, phân tích cú pháp hoặc thay đổi responseEncoding trong web.config để làm cho nó hiển thị các ký tự unicode không?

+3

Bạn có nghĩa là ghi '\ u' thoát hơn là UTF-8? UTF-8 là một mã hóa Unicode hợp lệ và trình duyệt của bạn sẽ hiểu nó. Tại sao bạn cần '\ u' thoát? – Rup

+0

Một công ty thứ ba đang phát triển một ứng dụng iphone cho chúng tôi nói rằng họ phải có nó ở định dạng này. Tôi không biết tại sao nhưng nó có liên quan đến X-code và Titanium. – Maxelsson

Trả lời

4

Không cần thoát nếu khách hàng là trình duyệt web hoặc bất kỳ ứng dụng khách nào khác xử lý http chính xác, miễn là máy chủ của bạn thông báo chính xác cho khách hàng về loại nội dung và mã hóa nội dung, và mã hóa bạn chọn hỗ trợ codepoints trong dữ liệu gửi đi.

Nếu khách hàng không hoạt động chính xác và thực sự cần các chuỗi thoát như vậy, bạn sẽ phải tự viết lớp ActionResult của riêng mình và tự thoát. Kế thừa từ JsonResult để bắt đầu và sử dụng sự phản chiếu để tạo tài liệu JSON theo ý bạn.

Đó là công việc vặt!

EDIT: Điều này sẽ giúp bạn bắt đầu

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"); 
    } 
} 
+0

Ok. Khách hàng là một ứng dụng iphone được phát triển bởi Titanium bởi một công ty khác. Làm cách nào để thoát khỏi chuỗi ký tự và các ký tự đặc biệt thực sự giống như trong C#? Thay thế sẽ không hoạt động? – Maxelsson

+0

Không, nếu bạn sử dụng phản xạ hoặc tương tự như nhìn vào HtmlEncode hoặc thư viện AntiXss sau đó tôi nghĩ bạn sẽ thấy họ quét đầu vào struct một ký tự tại một thời điểm sau đó đầu ra cho một StringBuilder. – Rup

+0

Tôi đã cập nhật câu trả lời của mình để giúp bạn bắt đầu đi đúng hướng. –

0

Có một số cách để thoát, nhưng không có cách nào thực hiện chính xác những gì bạn muốn (HtmlEncode and UrlEncode) Bạn sẽ cần một hàm do người dùng xác định để thực hiện thoát.

0

Không chắc chắn nếu điều này giúp nhưng tôi đã nhận được các ký tự unicode bằng cách sử dụng bên dưới dòng: System.Web.Script.Serialization.JavaScriptSerializer jsonSerializer = new System.Web .Script.Serialization.JavaScriptSerializer(); trả về Json (jsonSerializer.Serialize (validationResult));

Các vấn đề liên quan