From 5904b9ce8b45591a300ba723e2ab290b018d5513 Mon Sep 17 00:00:00 2001 From: Serj Lotutovici Date: Sun, 22 Jan 2017 23:06:33 +0100 Subject: [PATCH] Class and Enum adapters now rely only on Options. --- .../java/com/squareup/moshi/ClassJsonAdapter.java | 14 ++++---------- .../com/squareup/moshi/StandardJsonAdapters.java | 9 +++------ 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/moshi/src/main/java/com/squareup/moshi/ClassJsonAdapter.java b/moshi/src/main/java/com/squareup/moshi/ClassJsonAdapter.java index 510e30d..6cf71df 100644 --- a/moshi/src/main/java/com/squareup/moshi/ClassJsonAdapter.java +++ b/moshi/src/main/java/com/squareup/moshi/ClassJsonAdapter.java @@ -21,7 +21,6 @@ import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Modifier; import java.lang.reflect.Type; -import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import java.util.TreeMap; @@ -122,18 +121,16 @@ final class ClassJsonAdapter extends JsonAdapter { /** Returns true if fields with {@code modifiers} are included in the emitted JSON. */ private boolean includeField(boolean platformType, int modifiers) { if (Modifier.isStatic(modifiers) || Modifier.isTransient(modifiers)) return false; - return Modifier.isPublic(modifiers) || Modifier.isProtected(modifiers)|| !platformType; + return Modifier.isPublic(modifiers) || Modifier.isProtected(modifiers) || !platformType; } }; private final ClassFactory classFactory; - private final Map> fieldsMap; private final FieldBinding[] fieldsArray; private final JsonReader.Options options; ClassJsonAdapter(ClassFactory classFactory, Map> fieldsMap) { this.classFactory = classFactory; - this.fieldsMap = new LinkedHashMap<>(fieldsMap); this.fieldsArray = fieldsMap.values().toArray(new FieldBinding[fieldsMap.size()]); this.options = JsonReader.Options.of( fieldsMap.keySet().toArray(new String[fieldsMap.size()])); @@ -162,12 +159,9 @@ final class ClassJsonAdapter extends JsonAdapter { if (index != -1) { fieldBinding = fieldsArray[index]; } else { - String name = reader.nextName(); - fieldBinding = fieldsMap.get(name); - if (fieldBinding == null) { - reader.skipValue(); - continue; - } + reader.nextName(); + reader.skipValue(); + continue; } fieldBinding.read(reader, result); } diff --git a/moshi/src/main/java/com/squareup/moshi/StandardJsonAdapters.java b/moshi/src/main/java/com/squareup/moshi/StandardJsonAdapters.java index 9aad72c..fb7960c 100644 --- a/moshi/src/main/java/com/squareup/moshi/StandardJsonAdapters.java +++ b/moshi/src/main/java/com/squareup/moshi/StandardJsonAdapters.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; @@ -214,7 +215,6 @@ final class StandardJsonAdapters { static final class EnumJsonAdapter> extends JsonAdapter { private final Class enumType; - private final Map nameConstantMap; private final String[] nameStrings; private final T[] constants; private final JsonReader.Options options; @@ -223,13 +223,11 @@ final class StandardJsonAdapters { this.enumType = enumType; try { constants = enumType.getEnumConstants(); - nameConstantMap = new LinkedHashMap<>(); nameStrings = new String[constants.length]; for (int i = 0; i < constants.length; i++) { T constant = constants[i]; Json annotation = enumType.getField(constant.name()).getAnnotation(Json.class); String name = annotation != null ? annotation.name() : constant.name(); - nameConstantMap.put(name, constant); nameStrings[i] = name; } options = JsonReader.Options.of(nameStrings); @@ -242,11 +240,10 @@ final class StandardJsonAdapters { int index = reader.selectString(options); if (index != -1) return constants[index]; + // We can consume the string safely, we are terminating anyway. String name = reader.nextString(); - T constant = nameConstantMap.get(name); - if (constant != null) return constant; throw new JsonDataException("Expected one of " - + nameConstantMap.keySet() + " but was " + name + " at path " + + Arrays.asList(nameStrings) + " but was " + name + " at path " + reader.getPath()); }