package frame.data.reader; import java.util.Map; import java.util.Set; import frame.data.convert.Convertor; import frame.util.ContentBuilder; public class MapReader extends EntityReader { protected Convertor translator; protected IEntityReader valueReader; public MapReader(Class clazz) throws Exception { super(clazz); } @Override protected void initValueReader(Class dataType) throws Exception { if (translator == null && valueReader == null) { if (Convertor.containsType(dataType)) { translator = Convertor.getInstance(dataType); } else { valueReader = EntityReader.getInstance(dataType); } } } @SuppressWarnings("unchecked") @Override public String getString(Object entity) { try { Map map = (Map) entity; if (map.isEmpty()) { return "[]"; } ContentBuilder result = new ContentBuilder(); result.append("["); Set keys = map.keySet(); initValueReader(keys.iterator().next().getClass()); for (Object key: keys) { Object obj = map.get(key); try { if (translator != null) { result.append(key, ",").append(":").append(translator.toString(obj)); } else { result.append(key, ",").append(":").append(valueReader.getString(obj)); } } catch (Exception e) { result.append(key, ",").append(":error"); } } result.append("]"); return result.toString(); } catch (Exception e) { return e.getMessage(); } } @SuppressWarnings("unchecked") @Override public String getJSONString(Object entity) throws Exception { Map map = (Map) entity; if (map.isEmpty()) { return "{}"; } ContentBuilder result = new ContentBuilder(); result.append("{"); Set keys = map.keySet(); try { Class clazz = keys.iterator().next().getClass(); initValueReader(clazz); } catch (Exception e) { return e.getMessage(); } for (Object key: keys) { Object obj = map.get(key); try { if (translator != null) { result.append("\"", ",").append(key).append("\":").append(translator.toJSONString(obj)); } else { result.append("\"", ",").append(key).append("\":").append(valueReader.getJSONString(obj)); } } catch (Exception e) { result.append("\"", ",").append(key).append("\":\"error\""); } } result.append("}"); return result.toString(); } }