diff --git a/gson/src/main/java/com/google/gson/FieldNamingPolicy.java b/gson/src/main/java/com/google/gson/FieldNamingPolicy.java
index ad7bb6c8..1f1eb8f1 100644
--- a/gson/src/main/java/com/google/gson/FieldNamingPolicy.java
+++ b/gson/src/main/java/com/google/gson/FieldNamingPolicy.java
@@ -114,6 +114,29 @@ public enum FieldNamingPolicy implements FieldNamingStrategy {
@Override public String translateName(Field f) {
return separateCamelCase(f.getName(), "-").toLowerCase(Locale.ENGLISH);
}
+ },
+
+ /**
+ * Using this naming policy with Gson will modify the Java Field name from its camel cased
+ * form to a lower case field name where each word is separated by a dot (.).
+ *
+ *
Here's a few examples of the form "Java Field Name" ---> "JSON Field Name":
+ *
+ * - someFieldName ---> some.field.name
+ * - _someFieldName ---> _some.field.name
+ * - aStringField ---> a.string.field
+ * - aURL ---> a.u.r.l
+ *
+ * Using dots in JavaScript is not recommended since dot is also used for a member sign in
+ * expressions. This requires that a field named with dots is always accessed as a quoted
+ * property like {@code myobject['my.field']}. Accessing it as an object field
+ * {@code myobject.my.field} will result in an unintended javascript expression.
+ * @since 2.8
+ */
+ LOWER_CASE_WITH_DOTS() {
+ @Override public String translateName(Field f) {
+ return separateCamelCase(f.getName(), ".").toLowerCase(Locale.ENGLISH);
+ }
};
/**
diff --git a/gson/src/test/java/com/google/gson/functional/NamingPolicyTest.java b/gson/src/test/java/com/google/gson/functional/NamingPolicyTest.java
index c3c0be1d..823ad2fe 100644
--- a/gson/src/test/java/com/google/gson/functional/NamingPolicyTest.java
+++ b/gson/src/test/java/com/google/gson/functional/NamingPolicyTest.java
@@ -63,6 +63,14 @@ public class NamingPolicyTest extends TestCase {
+ target.someConstantStringInstanceField + "\"}", gson.toJson(target));
}
+ public void testGsonWithLowerCaseDotPolicySerialization() {
+ Gson gson = builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DOTS).create();
+ StringWrapper target = new StringWrapper("blah");
+ assertEquals("{\"some.constant.string.instance.field\":\""
+ + target.someConstantStringInstanceField + "\"}", gson.toJson(target));
+ }
+
+
public void testGsonWithLowerCaseDashPolicyDeserialiation() {
Gson gson = builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES).create();
String target = "{\"some-constant-string-instance-field\":\"someValue\"}";