2011-01-18 28 views
11

Tôi đã đấu tranh trong vài giờ và không có kết quả tốt. Tôi đang cố gắng sử dụng .NET JSON Serializers để chuyển đổi JSON qua lại từ giao diện người dùng thành các đối tượng.Làm cách nào để bản địa hóa khi tuần tự hóa JSON?

Sự cố xảy ra với số thập phân vì tiêu chuẩn cho văn hóa của tôi có "," làm dấu phân cách thập phân thay vì ".". Tôi đã thử triển khai trình chuyển đổi tùy chỉnh (xem câu hỏi this) mà không có kết quả tốt.

Tôi cũng đã kiểm tra NewtonSoft JSON.net mà không có kết quả tốt hơn. Cho đến nay có vẻ như việc kết hợp với các kiểu giá trị được thực hiện một cách bất biến văn hóa. Tôi muốn ghi đè hành vi này, làm thế nào để làm điều đó?

BTW, tôi thực sự muốn tránh bản địa hóa ở phía javascript. Tôi chắc chắn muốn .NET để chăm sóc định dạng văn hóa và bản địa hóa, tôi không nghĩ có trường hợp ngoại lệ như tôi đang tìm kiếm với serializers này, tôi đoán là có một cách thích hợp để làm điều này.

Xin cảm ơn trước.

Trả lời

11

Tiêu chuẩn JSON để tuần tự hóa các giá trị thập phân không cung cấp cho định dạng được bản địa hóa. (Xem JSON.org.) Đây là lý do tại sao các giá trị luôn được định dạng bằng văn bản Bất biến.

Nếu bạn cần các giá trị được bản địa hóa, bạn sẽ cần phải tạo một trình biến đổi tùy chỉnh cho bộ nối tiếp lựa chọn của bạn, đầu ra các số thập phân như các chuỗi được định dạng trước. Trong Json.Net, điều này có thể được thực hiện một cách dễ dàng như hình dưới đây:

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<decimal> values = new List<decimal> { 1.1M, 3.14M, -0.9M, 1000.42M }; 

     var converter = new FormattedDecimalConverter(CultureInfo.GetCultureInfo("fr-FR")); 
     string json = JsonConvert.SerializeObject(values, converter); 

     Console.WriteLine(json); 
    } 
} 

class FormattedDecimalConverter : JsonConverter 
{ 
    private CultureInfo culture; 

    public FormattedDecimalConverter(CultureInfo culture) 
    { 
     this.culture = culture; 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return (objectType == typeof(decimal) || 
       objectType == typeof(double) || 
       objectType == typeof(float)); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     writer.WriteValue(Convert.ToString(value, culture)); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Output:

["1,1","3,14","-0,9","1000,42"] 
+1

Cảm ơn bạn rất nhiều vì đã dành thời gian để trả lời. Câu hỏi này hơi cũ nhưng tôi vẫn đánh giá cao việc học cách tiếp cận những vấn đề này trong tương lai. Cảm ơn một lần nữa! – Alpha

+1

Rất vui được trợ giúp. Chúc mừng năm mới! –

1

Bạn đang thiết lập thích hợp CultureInfo về chủ đề hiện tại của bạn CurrentCultureCurrentUICulture tính?

+0

Chắc chắn. Vấn đề là JavaScriptSerializer (http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx) hoạt động trên Culture.InvariantCulture. Dunno tại sao. – Alpha

+0

Hơn bạn có thể muốn xem xét plugin jQuery Globalization của Microsoft: http://weblogs.asp.net/scottgu/archive/2010/06/10/jquery-globalization-plugin-from-microsoft.aspx –

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