2011-01-18 14 views
11

Walczyłem już od kilku godzin bez żadnego dobrego wyniku. Próbuję użyć .NET JSON Serializers do konwersji JSON tam iz powrotem z interfejsu użytkownika na obiekty.Jak zlokalizować po serializacji JSON?

Problem powstaje w wyniku ułamków dziesiętnych, ponieważ standard dla mojej kultury ma "," jako separator dziesiętny zamiast ".". Próbowałem zaimplementować niestandardowy konwerter (patrz pytanie this) bez dobrych wyników.

Sprawdziłem również NewtonSoft JSON.net bez lepszych wyników. Jak dotąd wydaje się, że dopasowywanie do typów wartości odbywa się w sposób niezmienny. Chcę zastąpić to zachowanie, jak to zrobić?

BTW, naprawdę chcę uniknąć lokalizacji po stronie javascript. Zdecydowanie chcę .NET, aby zająć się formatowaniem i lokalizacją międzykulturową, nie sądzę, że powinny istnieć wyjątki, takie jak te, które znajduję z tymi serializatorami. Przypuszczam, że powinien to być właściwy sposób.

Z góry dziękuję.

Odpowiedz

11

Standard JSON do szeregowania wartości dziesiętnych nie zapewnia lokalnego formatowania. (Patrz JSON.org.) Dlatego właśnie wartości są zawsze formatowane przy użyciu kultury Invariant.

Jeśli potrzebujesz zlokalizowanych wartości, musisz utworzyć niestandardowy konwerter dla wybranego serializera, który zamiast tego podaje dziesiętne jako wstępnie sformatowane łańcuchy. W Json.NET, można to zrobić łatwo, jak pokazano poniżej:

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

wyjściowa:

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

Dzięki dużo za poświęcenie czasu na odpowiedź. Pytanie jest trochę stare, ale wciąż doceniam uczenie się, jak podejść do tych problemów w przyszłości. Dzięki jeszcze raz! – Alpha

+1

Cieszę się, że mogę Ci pomóc. Szczęśliwego Nowego Roku! –

1

Czy ustawienie właściwego CultureInfo od bieżącego wątku CurrentCulture i CurrentUICulture właściwości?

+0

Zdecydowanie. Problem polega na tym, że JavaScriptSerializer (http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx) działa na Culture.InvariantCulture. Nie wiem dlaczego. – Alpha

+0

Następnie możesz rzucić okiem na wtyczkę jQuery Globalization firmy Microsoft: http://weblogs.asp.net/scottgu/archive/2010/06/10/jquery-globalization-plugin-from-microsoft.aspx –

Powiązane problemy