/** * Creates new instance of {@link jodd.json.MapToBean}. */ protected MapToBean createMapToBean(final String classMetadataName) { return new MapToBean(this, classMetadataName); }
/** * Converts type of all list elements to match the component type. */ private Object generifyList(final List list, final Class componentType) { for (int i = 0; i < list.size(); i++) { Object element = list.get(i); if (element != null) { if (element instanceof Map) { Object bean = map2bean((Map) element, componentType); list.set(i, bean); } else { Object value = convert(element, componentType); list.set(i, value); } } } return list; }
checkClassName(jsonParser.classnameWhitelist, className); if (value instanceof List) { if (componentType != null && componentType != String.class) { value = generifyList((List) value, componentType); value = map2bean((Map) value, propertyType); value = generifyMap((Map) value, keyType, componentType); setValue(target, pd, value); } catch (Exception ignore) { ignore.printStackTrace();
protected Object convert(final Object value, final Class targetType) { Class valueClass = value.getClass(); if (valueClass == targetType) { return value; } if (value instanceof Map) { if (targetType == Map.class) { return value; } return map2bean((Map) value, targetType); } try { return TypeConverterManager.get().convertType(value, targetType); } catch (Exception ex) { throw new JsonException("Type conversion failed", ex); } }
/** * Change map elements to match key and value types. */ protected <K,V> Map<K, V> generifyMap(final Map<Object, Object> map, final Class<K> keyType, final Class<V> valueType) { if (keyType == String.class) { // only value type is changed, we can make value replacements for (Map.Entry<Object, Object> entry : map.entrySet()) { Object value = entry.getValue(); Object newValue = convert(value, valueType); if (value != newValue) { entry.setValue(newValue); } } return (Map<K, V>) map; } // key is changed too, we need a new map Map<K, V> newMap = new HashMap<>(map.size()); for (Map.Entry<Object, Object> entry : map.entrySet()) { Object key = entry.getKey(); Object newKey = convert(key, keyType); Object value = entry.getValue(); Object newValue = convert(value, valueType); newMap.put((K)newKey, (V)newValue); } return newMap; }
Map map = (Map) value; value = mapToBean.map2bean(map, null);
target = mapToBean.map2bean((Map) target, targetType);