📄 defaulttypeadapters.java
字号:
/* * Copyright (C) 2008 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;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.math.BigDecimal;import java.math.BigInteger;import java.net.MalformedURLException;import java.net.URI;import java.net.URISyntaxException;import java.net.URL;import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Collection;import java.util.Date;import java.util.GregorianCalendar;import java.util.HashSet;import java.util.LinkedHashMap;import java.util.LinkedList;import java.util.List;import java.util.Locale;import java.util.Map;import java.util.Properties;import java.util.Queue;import java.util.Set;import java.util.SortedSet;import java.util.StringTokenizer;import java.util.TreeSet;import java.util.UUID;/** * List of all the default type adapters ({@link JsonSerializer}s, {@link JsonDeserializer}s, * and {@link InstanceCreator}s. * * @author Inderjeet Singh * @author Joel Leitch */final class DefaultTypeAdapters { private static final DefaultDateTypeAdapter DATE_TYPE_ADAPTER = new DefaultDateTypeAdapter(DateFormat.getDateTimeInstance()); @SuppressWarnings("unchecked") private static final EnumTypeAdapter ENUM_TYPE_ADAPTER = new EnumTypeAdapter(); private static final UrlTypeAdapter URL_TYPE_ADAPTER = new UrlTypeAdapter(); private static final UriTypeAdapter URI_TYPE_ADAPTER = new UriTypeAdapter(); private static final UuidTypeAdapter UUUID_TYPE_ADAPTER = new UuidTypeAdapter(); private static final LocaleTypeAdapter LOCALE_TYPE_ADAPTER = new LocaleTypeAdapter(); private static final CollectionTypeAdapter COLLECTION_TYPE_ADAPTER = new CollectionTypeAdapter(); private static final MapTypeAdapter MAP_TYPE_ADAPTER = new MapTypeAdapter(); private static final BigDecimalTypeAdapter BIG_DECIMAL_TYPE_ADAPTER = new BigDecimalTypeAdapter(); private static final BigIntegerTypeAdapter BIG_INTEGER_TYPE_ADAPTER = new BigIntegerTypeAdapter(); private static final BooleanTypeAdapter BOOLEAN_TYPE_ADAPTER = new BooleanTypeAdapter(); private static final ByteTypeAdapter BYTE_TYPE_ADAPTER = new ByteTypeAdapter(); private static final CharacterTypeAdapter CHARACTER_TYPE_ADAPTER = new CharacterTypeAdapter(); private static final DoubleDeserializer DOUBLE_TYPE_ADAPTER = new DoubleDeserializer(); private static final FloatDeserializer FLOAT_TYPE_ADAPTER = new FloatDeserializer(); private static final IntegerTypeAdapter INTEGER_TYPE_ADAPTER = new IntegerTypeAdapter(); private static final LongDeserializer LONG_DESERIALIZER = new LongDeserializer(); private static final NumberTypeAdapter NUMBER_TYPE_ADAPTER = new NumberTypeAdapter(); private static final ShortTypeAdapter SHORT_TYPE_ADAPTER = new ShortTypeAdapter(); private static final StringTypeAdapter STRING_TYPE_ADAPTER = new StringTypeAdapter(); private static final PropertiesCreator PROPERTIES_CREATOR = new PropertiesCreator(); private static final TreeSetCreator TREE_SET_CREATOR = new TreeSetCreator(); private static final HashSetCreator HASH_SET_CREATOR = new HashSetCreator(); private static final GregorianCalendarTypeAdapter GREGORIAN_CALENDAR_TYPE_ADAPTER = new GregorianCalendarTypeAdapter(); // The constants DEFAULT_SERIALIZERS, DEFAULT_DESERIALIZERS, and DEFAULT_INSTANCE_CREATORS // must be defined after the constants for the type adapters. Otherwise, the type adapter // constants will appear as nulls. private static final ParameterizedTypeHandlerMap<JsonSerializer<?>> DEFAULT_SERIALIZERS = createDefaultSerializers(); private static final ParameterizedTypeHandlerMap<JsonDeserializer<?>> DEFAULT_DESERIALIZERS = createDefaultDeserializers(); private static final ParameterizedTypeHandlerMap<InstanceCreator<?>> DEFAULT_INSTANCE_CREATORS = createDefaultInstanceCreators(); private static ParameterizedTypeHandlerMap<JsonSerializer<?>> createDefaultSerializers() { ParameterizedTypeHandlerMap<JsonSerializer<?>> map = new ParameterizedTypeHandlerMap<JsonSerializer<?>>(); map.register(Enum.class, ENUM_TYPE_ADAPTER); map.register(URL.class, URL_TYPE_ADAPTER); map.register(URI.class, URI_TYPE_ADAPTER); map.register(UUID.class, UUUID_TYPE_ADAPTER); map.register(Locale.class, LOCALE_TYPE_ADAPTER); map.register(Collection.class, COLLECTION_TYPE_ADAPTER); map.register(Map.class, MAP_TYPE_ADAPTER); map.register(Date.class, DATE_TYPE_ADAPTER); map.register(Calendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER); map.register(GregorianCalendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER); map.register(BigDecimal.class, BIG_DECIMAL_TYPE_ADAPTER); map.register(BigInteger.class, BIG_INTEGER_TYPE_ADAPTER); // Add primitive serializers map.register(Boolean.class, BOOLEAN_TYPE_ADAPTER); map.register(boolean.class, BOOLEAN_TYPE_ADAPTER); map.register(Byte.class, BYTE_TYPE_ADAPTER); map.register(byte.class, BYTE_TYPE_ADAPTER); map.register(Character.class, CHARACTER_TYPE_ADAPTER); map.register(char.class, CHARACTER_TYPE_ADAPTER); map.register(Integer.class, INTEGER_TYPE_ADAPTER); map.register(int.class, INTEGER_TYPE_ADAPTER); map.register(Number.class, NUMBER_TYPE_ADAPTER); map.register(Short.class, SHORT_TYPE_ADAPTER); map.register(short.class, SHORT_TYPE_ADAPTER); map.register(String.class, STRING_TYPE_ADAPTER); map.makeUnmodifiable(); return map; } private static ParameterizedTypeHandlerMap<JsonDeserializer<?>> createDefaultDeserializers() { ParameterizedTypeHandlerMap<JsonDeserializer<?>> map = new ParameterizedTypeHandlerMap<JsonDeserializer<?>>(); map.register(Enum.class, wrapDeserializer(ENUM_TYPE_ADAPTER)); map.register(URL.class, wrapDeserializer(URL_TYPE_ADAPTER)); map.register(URI.class, wrapDeserializer(URI_TYPE_ADAPTER)); map.register(UUID.class, wrapDeserializer(UUUID_TYPE_ADAPTER)); map.register(Locale.class, wrapDeserializer(LOCALE_TYPE_ADAPTER)); map.register(Collection.class, wrapDeserializer(COLLECTION_TYPE_ADAPTER)); map.register(Map.class, wrapDeserializer(MAP_TYPE_ADAPTER)); map.register(Date.class, wrapDeserializer(DATE_TYPE_ADAPTER)); map.register(Calendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER); map.register(GregorianCalendar.class, GREGORIAN_CALENDAR_TYPE_ADAPTER); map.register(BigDecimal.class, wrapDeserializer(BIG_DECIMAL_TYPE_ADAPTER)); map.register(BigInteger.class, wrapDeserializer(BIG_INTEGER_TYPE_ADAPTER)); // Add primitive deserializers map.register(Boolean.class, wrapDeserializer(BOOLEAN_TYPE_ADAPTER)); map.register(boolean.class, wrapDeserializer(BOOLEAN_TYPE_ADAPTER)); map.register(Byte.class, wrapDeserializer(BYTE_TYPE_ADAPTER)); map.register(byte.class, wrapDeserializer(BYTE_TYPE_ADAPTER)); map.register(Character.class, wrapDeserializer(CHARACTER_TYPE_ADAPTER)); map.register(char.class, wrapDeserializer(CHARACTER_TYPE_ADAPTER)); map.register(Double.class, wrapDeserializer(DOUBLE_TYPE_ADAPTER)); map.register(double.class, wrapDeserializer(DOUBLE_TYPE_ADAPTER)); map.register(Float.class, wrapDeserializer(FLOAT_TYPE_ADAPTER)); map.register(float.class, wrapDeserializer(FLOAT_TYPE_ADAPTER)); map.register(Integer.class, wrapDeserializer(INTEGER_TYPE_ADAPTER)); map.register(int.class, wrapDeserializer(INTEGER_TYPE_ADAPTER)); map.register(Long.class, wrapDeserializer(LONG_DESERIALIZER)); map.register(long.class, wrapDeserializer(LONG_DESERIALIZER)); map.register(Number.class, wrapDeserializer(NUMBER_TYPE_ADAPTER)); map.register(Short.class, wrapDeserializer(SHORT_TYPE_ADAPTER)); map.register(short.class, wrapDeserializer(SHORT_TYPE_ADAPTER)); map.register(String.class, wrapDeserializer(STRING_TYPE_ADAPTER)); map.makeUnmodifiable(); return map; } private static ParameterizedTypeHandlerMap<InstanceCreator<?>> createDefaultInstanceCreators() { ParameterizedTypeHandlerMap<InstanceCreator<?>> map = new ParameterizedTypeHandlerMap<InstanceCreator<?>>(); map.register(Map.class, MAP_TYPE_ADAPTER); // Add Collection type instance creators map.register(Collection.class, COLLECTION_TYPE_ADAPTER); map.register(List.class, COLLECTION_TYPE_ADAPTER); map.register(Queue.class, COLLECTION_TYPE_ADAPTER); map.register(Set.class, HASH_SET_CREATOR); map.register(SortedSet.class, TREE_SET_CREATOR); map.register(Properties.class, PROPERTIES_CREATOR); map.makeUnmodifiable(); return map; } @SuppressWarnings("unchecked") private static JsonDeserializer<?> wrapDeserializer(JsonDeserializer<?> deserializer) { return new JsonDeserializerExceptionWrapper(deserializer); } static ParameterizedTypeHandlerMap<JsonSerializer<?>> getDefaultSerializers() { return getDefaultSerializers(false, LongSerializationPolicy.DEFAULT); } static ParameterizedTypeHandlerMap<JsonSerializer<?>> getDefaultSerializers( boolean serializeSpecialFloatingPointValues, LongSerializationPolicy longSerializationPolicy) { ParameterizedTypeHandlerMap<JsonSerializer<?>> serializers = new ParameterizedTypeHandlerMap<JsonSerializer<?>>(); // Double primitive DefaultTypeAdapters.DoubleSerializer doubleSerializer = new DefaultTypeAdapters.DoubleSerializer(serializeSpecialFloatingPointValues); serializers.registerIfAbsent(Double.class, doubleSerializer); serializers.registerIfAbsent(double.class, doubleSerializer); // Float primitive DefaultTypeAdapters.FloatSerializer floatSerializer = new DefaultTypeAdapters.FloatSerializer(serializeSpecialFloatingPointValues); serializers.registerIfAbsent(Float.class, floatSerializer); serializers.registerIfAbsent(float.class, floatSerializer); // Long primitive DefaultTypeAdapters.LongSerializer longSerializer = new DefaultTypeAdapters.LongSerializer(longSerializationPolicy); serializers.registerIfAbsent(Long.class, longSerializer); serializers.registerIfAbsent(long.class, longSerializer); serializers.registerIfAbsent(DEFAULT_SERIALIZERS); return serializers; } static ParameterizedTypeHandlerMap<JsonDeserializer<?>> getDefaultDeserializers() { return DEFAULT_DESERIALIZERS; } static ParameterizedTypeHandlerMap<InstanceCreator<?>> getDefaultInstanceCreators() { return DEFAULT_INSTANCE_CREATORS; } static class DefaultDateTypeAdapter implements JsonSerializer<Date>, JsonDeserializer<Date> { private final DateFormat format; public DefaultDateTypeAdapter(String datePattern) { this.format = new SimpleDateFormat(datePattern); } DefaultDateTypeAdapter(DateFormat format) { this.format = format; } public DefaultDateTypeAdapter(int style) { this.format = DateFormat.getDateInstance(style); } public DefaultDateTypeAdapter(int dateStyle, int timeStyle) { this.format = DateFormat.getDateTimeInstance(dateStyle, timeStyle); } public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) { String dateFormatAsString = format.format(src); return new JsonPrimitive(dateFormatAsString); } public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { if (!(json instanceof JsonPrimitive)) { throw new JsonParseException("The date should be a string value"); } try { return format.parse(json.getAsString()); } catch (ParseException e) { throw new JsonParseException(e); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -