return decodeString(fieldMap, object, data);
}
public static Object decodeString(CodableClassInfo fieldMap, Object object, KVPairs data) throws Exception {
for (Iterator<CodableFieldInfo> fields = fieldMap.values().iterator(); fields.hasNext();) {
CodableFieldInfo field = fields.next();
String name = field.getName();
if (field.isArray()) {
field.set(object, decodeArray(field.getTypeOrComponentType(), data, name));
} else if (field.isCollection()) {
List<String> arr = getList(data, name);
int size = arr.size();
if (size > 0) {
Collection<Object> value = (Collection<Object>) field.getTypeOrComponentType().newInstance();
Class<?> vc = field.getCollectionClass();
boolean va = field.isCollectionArray();
for (int i = 0; i < size; i++) {
value.add(decodeString(vc, arr.get(i)));
}
field.set(object, value);
}
} else if (field.isMap()) {
Map<String, Object> map = (Map<String, Object>) field.getTypeOrComponentType().newInstance();
// value type, assume key is String
Class<?> kc = field.getMapKeyClass();
Class<?> vc = field.getMapValueClass();
for (KVPair p : new KVPairs(data.getValue(name))) {
map.put(p.getKey(), decodeString(vc, p.getValue()));
}
field.set(object, map);
} else if (field.isCodable()) {
field.set(object, decodeString(field.getTypeOrComponentType(), data.getValue(name)));
} else if (field.isEnum()) {
field.set(object, decodeEnum((Class<Enum>) field.getTypeOrComponentType(),
data.getValue(name)));
} else if (field.isNative()) {
field.set(object, decodeNative(field.getTypeOrComponentType(), data.getValue(name)));
}
}
if (object instanceof SuperCodable) {
((SuperCodable) object).postDecode();
}