package net.minidev.json.writer; /* * Copyright 2011 JSON-SMART authors * * 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. */ import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Date; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import net.minidev.json.JSONArray; import net.minidev.json.JSONAware; import net.minidev.json.JSONAwareEx; import net.minidev.json.JSONObject; public class JsonReader { private final ConcurrentHashMap> cache; public JsonReaderI DEFAULT; public JsonReaderI DEFAULT_ORDERED; public JsonReader() { cache = new ConcurrentHashMap>(100); cache.put(Date.class, BeansMapper.MAPPER_DATE); cache.put(int[].class, ArraysMapper.MAPPER_PRIM_INT); cache.put(Integer[].class, ArraysMapper.MAPPER_INT); cache.put(short[].class, ArraysMapper.MAPPER_PRIM_INT); cache.put(Short[].class, ArraysMapper.MAPPER_INT); cache.put(long[].class, ArraysMapper.MAPPER_PRIM_LONG); cache.put(Long[].class, ArraysMapper.MAPPER_LONG); cache.put(byte[].class, ArraysMapper.MAPPER_PRIM_BYTE); cache.put(Byte[].class, ArraysMapper.MAPPER_BYTE); cache.put(char[].class, ArraysMapper.MAPPER_PRIM_CHAR); cache.put(Character[].class, ArraysMapper.MAPPER_CHAR); cache.put(float[].class, ArraysMapper.MAPPER_PRIM_FLOAT); cache.put(Float[].class, ArraysMapper.MAPPER_FLOAT); cache.put(double[].class, ArraysMapper.MAPPER_PRIM_DOUBLE); cache.put(Double[].class, ArraysMapper.MAPPER_DOUBLE); cache.put(boolean[].class, ArraysMapper.MAPPER_PRIM_BOOL); cache.put(Boolean[].class, ArraysMapper.MAPPER_BOOL); this.DEFAULT = new DefaultMapper(this); this.DEFAULT_ORDERED = new DefaultMapperOrdered(this); cache.put(JSONAwareEx.class, this.DEFAULT); cache.put(JSONAware.class, this.DEFAULT); cache.put(JSONArray.class, this.DEFAULT); cache.put(JSONObject.class, this.DEFAULT); } /** * remap field name in custom classes * * @param fromJson * field name in json * @param toJava * field name in Java * @since 2.1.1 */ public void remapField(Class type, String fromJson, String toJava) { JsonReaderI map = this.getMapper(type); if (!(map instanceof MapperRemapped)) { map = new MapperRemapped(map); registerReader(type, map); } ((MapperRemapped) map).renameField(fromJson, toJava); } public void registerReader(Class type, JsonReaderI mapper) { cache.put(type, mapper); } @SuppressWarnings("unchecked") public JsonReaderI getMapper(Type type) { if (type instanceof ParameterizedType) return getMapper((ParameterizedType) type); return getMapper((Class) type); } /** * Get the corresponding mapper Class, or create it on first call * * @param type * to be map */ public JsonReaderI getMapper(Class type) { // look for cached Mapper @SuppressWarnings("unchecked") JsonReaderI map = (JsonReaderI) cache.get(type); if (map != null) return map; /* * Special handle */ if (type instanceof Class) { if (Map.class.isAssignableFrom(type)) map = new DefaultMapperCollection(this, type); else if (List.class.isAssignableFrom(type)) map = new DefaultMapperCollection(this, type); if (map != null) { cache.put(type, map); return map; } } if (type.isArray()) map = new ArraysMapper.GenericMapper(this, type); else if (List.class.isAssignableFrom(type)) map = new CollectionMapper.ListClass(this, type); else if (Map.class.isAssignableFrom(type)) map = new CollectionMapper.MapClass(this, type); else // use bean class map = new BeansMapper.Bean(this, type); cache.putIfAbsent(type, map); return map; } @SuppressWarnings("unchecked") public JsonReaderI getMapper(ParameterizedType type) { JsonReaderI map = (JsonReaderI) cache.get(type); if (map != null) return map; Class clz = (Class) type.getRawType(); if (List.class.isAssignableFrom(clz)) map = new CollectionMapper.ListType(this, type); else if (Map.class.isAssignableFrom(clz)) map = new CollectionMapper.MapType(this, type); cache.putIfAbsent(type, map); return map; } }