diff --git a/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java b/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java index 6e0f85ad6d..dc347e9dc4 100644 --- a/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java +++ b/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java @@ -921,7 +921,10 @@ public Locale read(JsonReader in) throws IOException { if (tokenizer.hasMoreElements()) { variant = tokenizer.nextToken(); } - if (country == null && variant == null) { + if (language == null) { + return Locale.ROOT; + } + if (country == null) { return new Locale(language); } else if (variant == null) { return new Locale(language, country); diff --git a/gson/src/test/java/com/google/gson/functional/DefaultTypeAdaptersTest.java b/gson/src/test/java/com/google/gson/functional/DefaultTypeAdaptersTest.java index 187c3f2808..d80d390bfb 100644 --- a/gson/src/test/java/com/google/gson/functional/DefaultTypeAdaptersTest.java +++ b/gson/src/test/java/com/google/gson/functional/DefaultTypeAdaptersTest.java @@ -263,6 +263,20 @@ public void testLocaleDeserializationWithLanguage() { assertThat(locale.getLanguage()).isEqualTo("en"); } + @Test + public void testLocaleDeserializationRoot() { + // Gson serializes Locale.ROOT to "", so it must read "" back to Locale.ROOT. + String json = "\"\""; + Locale locale = gson.fromJson(json, Locale.class); + assertThat(locale).isEqualTo(Locale.ROOT); + } + + @Test + public void testLocaleSerializationRoot() { + // Locale.ROOT round-trips: it is serialized as an empty string. + assertThat(gson.toJson(Locale.ROOT)).isEqualTo("\"\""); + } + @Test public void testLocaleSerializationWithLanguageCountry() { Locale target = Locale.CANADA_FRENCH;