package org.test4j.json.decoder;
import java.lang.reflect.Constructor;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
import org.test4j.json.JSON;
import org.test4j.json.decoder.base.MapPoJoBaseDecoder;
import org.test4j.json.helper.JSONMap;
import org.test4j.json.helper.JSONObject;
import org.test4j.tools.commons.ClazzHelper;
import org.test4j.tools.generic.GenericTypeFinder;
import org.test4j.tools.generic.GenericTypeMap;
@SuppressWarnings({ "rawtypes", "unchecked" })
public class MapDecoder extends MapPoJoBaseDecoder<Map> {
public static final MapDecoder toMAP = new MapDecoder();
@Override
protected void parseFromJSONMap(Map target, Type toType, JSONMap jsonMap, Map<String, Object> references) {
for (Map.Entry<JSONObject, JSONObject> entry : jsonMap.entrySet()) {
JSONObject jsonkey = entry.getKey();
if (jsonkey.equals(JSONMap.JSON_ClazzFlag)) {
continue;
}
JSONObject jsonvalue = entry.getValue();
GenericTypeMap typeMap = GenericTypeFinder.findGenericTypes(toType);
Type keyType = typeMap.getType(Map.class, "K");
Type valueType = typeMap.getType(Map.class, "V");
Object key = JSON.toObject(jsonkey, keyType, references);
Object value = JSON.toObject(jsonvalue, valueType, references);
target.put(key, value);
}
}
@Override
protected Map getTarget(JSONMap map, Type toType) {
Class claz = this.getTargetType(toType, map);
if (Object.class.equals(claz)) {
return new HashMap();
}
try {
Constructor constructor = claz.getConstructor();
if (constructor != null) {
Object value = ClazzHelper.newInstance(claz);
return (Map) value;
} else {
return new HashMap();
}
} catch (Exception e) {
return new HashMap();
}
}
/**
* Map类型或者没有指定PoJo类型的Object
*/
@Override
public boolean accept(Type type) {
Class claz = this.getRawType(type, null);
return Map.class.isAssignableFrom(claz) || Object.class.equals(type);
}
}