X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=gson%2Fcom%2Fgoogle%2Fgson%2Finternal%2Fbind%2FMapTypeAdapterFactory.java;fp=gson%2Fcom%2Fgoogle%2Fgson%2Finternal%2Fbind%2FMapTypeAdapterFactory.java;h=0000000000000000000000000000000000000000;hb=d1b96429477dd3d4b0fee33b232e3ba8925b2b19;hp=c3c616c4eb42923c980058e6a1289b9daa7177c1;hpb=306c1a65e1b352740d0c55ded51902735c2f78cc;p=unical.git diff --git a/gson/com/google/gson/internal/bind/MapTypeAdapterFactory.java b/gson/com/google/gson/internal/bind/MapTypeAdapterFactory.java deleted file mode 100644 index c3c616c..0000000 --- a/gson/com/google/gson/internal/bind/MapTypeAdapterFactory.java +++ /dev/null @@ -1,264 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.gson.internal.bind; - -import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.google.gson.JsonPrimitive; -import com.google.gson.JsonSyntaxException; -import com.google.gson.TypeAdapter; -import com.google.gson.TypeAdapterFactory; -import com.google.gson.internal.$Gson$Types; -import com.google.gson.internal.ConstructorConstructor; -import com.google.gson.internal.JsonReaderInternalAccess; -import com.google.gson.internal.ObjectConstructor; -import com.google.gson.internal.Streams; -import com.google.gson.reflect.TypeToken; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonToken; -import com.google.gson.stream.JsonWriter; -import java.io.IOException; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * Adapts maps to either JSON objects or JSON arrays. - * - *

Maps as JSON objects

- * For primitive keys or when complex map key serialization is not enabled, this - * converts Java {@link Map Maps} to JSON Objects. This requires that map keys - * can be serialized as strings; this is insufficient for some key types. For - * example, consider a map whose keys are points on a grid. The default JSON - * form encodes reasonably:
   {@code
- *   Map original = new LinkedHashMap();
- *   original.put(new Point(5, 6), "a");
- *   original.put(new Point(8, 8), "b");
- *   System.out.println(gson.toJson(original, type));
- * }
- * The above code prints this JSON object:
   {@code
- *   {
- *     "(5,6)": "a",
- *     "(8,8)": "b"
- *   }
- * }
- * But GSON is unable to deserialize this value because the JSON string name is - * just the {@link Object#toString() toString()} of the map key. Attempting to - * convert the above JSON to an object fails with a parse exception: - *
com.google.gson.JsonParseException: Expecting object found: "(5,6)"
- *   at com.google.gson.JsonObjectDeserializationVisitor.visitFieldUsingCustomHandler
- *   at com.google.gson.ObjectNavigator.navigateClassFields
- *   ...
- * - *

Maps as JSON arrays

- * An alternative approach taken by this type adapter when it is required and - * complex map key serialization is enabled is to encode maps as arrays of map - * entries. Each map entry is a two element array containing a key and a value. - * This approach is more flexible because any type can be used as the map's key; - * not just strings. But it's also less portable because the receiver of such - * JSON must be aware of the map entry convention. - * - *

Register this adapter when you are creating your GSON instance. - *

   {@code
- *   Gson gson = new GsonBuilder()
- *     .registerTypeAdapter(Map.class, new MapAsArrayTypeAdapter())
- *     .create();
- * }
- * This will change the structure of the JSON emitted by the code above. Now we - * get an array. In this case the arrays elements are map entries: - *
   {@code
- *   [
- *     [
- *       {
- *         "x": 5,
- *         "y": 6
- *       },
- *       "a",
- *     ],
- *     [
- *       {
- *         "x": 8,
- *         "y": 8
- *       },
- *       "b"
- *     ]
- *   ]
- * }
- * This format will serialize and deserialize just fine as long as this adapter - * is registered. - */ -public final class MapTypeAdapterFactory implements TypeAdapterFactory { - private final ConstructorConstructor constructorConstructor; - private final boolean complexMapKeySerialization; - - public MapTypeAdapterFactory(ConstructorConstructor constructorConstructor, - boolean complexMapKeySerialization) { - this.constructorConstructor = constructorConstructor; - this.complexMapKeySerialization = complexMapKeySerialization; - } - - public TypeAdapter create(Gson gson, TypeToken typeToken) { - Type type = typeToken.getType(); - - Class rawType = typeToken.getRawType(); - if (!Map.class.isAssignableFrom(rawType)) { - return null; - } - - Class rawTypeOfSrc = $Gson$Types.getRawType(type); - Type[] keyAndValueTypes = $Gson$Types.getMapKeyAndValueTypes(type, rawTypeOfSrc); - TypeAdapter keyAdapter = getKeyAdapter(gson, keyAndValueTypes[0]); - TypeAdapter valueAdapter = gson.getAdapter(TypeToken.get(keyAndValueTypes[1])); - ObjectConstructor constructor = constructorConstructor.get(typeToken); - - @SuppressWarnings({"unchecked", "rawtypes"}) - // we don't define a type parameter for the key or value types - TypeAdapter result = new Adapter(gson, keyAndValueTypes[0], keyAdapter, - keyAndValueTypes[1], valueAdapter, constructor); - return result; - } - - /** - * Returns a type adapter that writes the value as a string. - */ - private TypeAdapter getKeyAdapter(Gson context, Type keyType) { - return (keyType == boolean.class || keyType == Boolean.class) - ? TypeAdapters.BOOLEAN_AS_STRING - : context.getAdapter(TypeToken.get(keyType)); - } - - private final class Adapter extends TypeAdapter> { - private final TypeAdapter keyTypeAdapter; - private final TypeAdapter valueTypeAdapter; - private final ObjectConstructor> constructor; - - public Adapter(Gson context, Type keyType, TypeAdapter keyTypeAdapter, - Type valueType, TypeAdapter valueTypeAdapter, - ObjectConstructor> constructor) { - this.keyTypeAdapter = - new TypeAdapterRuntimeTypeWrapper(context, keyTypeAdapter, keyType); - this.valueTypeAdapter = - new TypeAdapterRuntimeTypeWrapper(context, valueTypeAdapter, valueType); - this.constructor = constructor; - } - - public Map read(JsonReader in) throws IOException { - JsonToken peek = in.peek(); - if (peek == JsonToken.NULL) { - in.nextNull(); - return null; - } - - Map map = constructor.construct(); - - if (peek == JsonToken.BEGIN_ARRAY) { - in.beginArray(); - while (in.hasNext()) { - in.beginArray(); // entry array - K key = keyTypeAdapter.read(in); - V value = valueTypeAdapter.read(in); - V replaced = map.put(key, value); - if (replaced != null) { - throw new JsonSyntaxException("duplicate key: " + key); - } - in.endArray(); - } - in.endArray(); - } else { - in.beginObject(); - while (in.hasNext()) { - JsonReaderInternalAccess.INSTANCE.promoteNameToValue(in); - K key = keyTypeAdapter.read(in); - V value = valueTypeAdapter.read(in); - V replaced = map.put(key, value); - if (replaced != null) { - throw new JsonSyntaxException("duplicate key: " + key); - } - } - in.endObject(); - } - return map; - } - - public void write(JsonWriter out, Map map) throws IOException { - if (map == null) { - out.nullValue(); - return; - } - - if (!complexMapKeySerialization) { - out.beginObject(); - for (Map.Entry entry : map.entrySet()) { - out.name(String.valueOf(entry.getKey())); - valueTypeAdapter.write(out, entry.getValue()); - } - out.endObject(); - return; - } - - boolean hasComplexKeys = false; - List keys = new ArrayList(map.size()); - - List values = new ArrayList(map.size()); - for (Map.Entry entry : map.entrySet()) { - JsonElement keyElement = keyTypeAdapter.toJsonTree(entry.getKey()); - keys.add(keyElement); - values.add(entry.getValue()); - hasComplexKeys |= keyElement.isJsonArray() || keyElement.isJsonObject(); - } - - if (hasComplexKeys) { - out.beginArray(); - for (int i = 0; i < keys.size(); i++) { - out.beginArray(); // entry array - Streams.write(keys.get(i), out); - valueTypeAdapter.write(out, values.get(i)); - out.endArray(); - } - out.endArray(); - } else { - out.beginObject(); - for (int i = 0; i < keys.size(); i++) { - JsonElement keyElement = keys.get(i); - out.name(keyToString(keyElement)); - valueTypeAdapter.write(out, values.get(i)); - } - out.endObject(); - } - } - - private String keyToString(JsonElement keyElement) { - if (keyElement.isJsonPrimitive()) { - JsonPrimitive primitive = keyElement.getAsJsonPrimitive(); - if (primitive.isNumber()) { - return String.valueOf(primitive.getAsNumber()); - } else if (primitive.isBoolean()) { - return Boolean.toString(primitive.getAsBoolean()); - } else if (primitive.isString()) { - return primitive.getAsString(); - } else { - throw new AssertionError(); - } - } else if (keyElement.isJsonNull()) { - return "null"; - } else { - throw new AssertionError(); - } - } - } -}