package com.brightgenerous.json.delegate; import java.io.IOException; import java.io.Reader; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.text.SimpleDateFormat; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion; import com.brightgenerous.json.JsonException; class JsonDelegaterJackson implements JsonDelegater { { check(); } private static void check() { try { Class.forName(ObjectMapper.class.getName()); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } @Override public Type getType(Object obj) { Type type = obj.getClass().getGenericSuperclass(); if (type instanceof ParameterizedType) { Type[] args = ((ParameterizedType) type).getActualTypeArguments(); if ((args != null) && (args.length == 1)) { return args[0]; } } throw new IllegalStateException("Reference must be specified actual type."); } @Override public <T> T parseJson(String json, Class<T> clazz, boolean serializeNulls) throws JsonException { return parseJson(json, clazz, null, serializeNulls); } @Override public <T> T parseJson(String json, Class<T> clazz, String dateFormat, boolean serializeNulls) throws JsonException { try { return create(dateFormat, serializeNulls).readValue(json, clazz); } catch (IOException e) { throw new JsonException(e); } } @Override public <T> T parseJson(String json, Type type, boolean serializeNulls) throws JsonException { return parseJson(json, type, null, serializeNulls); } @Override public <T> T parseJson(String json, Type type, String dateFormat, boolean serializeNulls) throws JsonException { try { ObjectMapper mapper = create(dateFormat, serializeNulls); return mapper.readValue(json, mapper.constructType(type)); } catch (IOException e) { throw new JsonException(e); } } @Override public <T> T parseJson(Reader json, Class<T> clazz, boolean serializeNulls) throws JsonException { return parseJson(json, clazz, null, serializeNulls); } @Override public <T> T parseJson(Reader json, Class<T> clazz, String dateFormat, boolean serializeNulls) throws JsonException { try { return create(dateFormat, serializeNulls).readValue(json, clazz); } catch (IOException e) { throw new JsonException(e); } } @Override public <T> T parseJson(Reader json, Type type, boolean serializeNulls) throws JsonException { return parseJson(json, type, null, serializeNulls); } @Override public <T> T parseJson(Reader json, Type type, String dateFormat, boolean serializeNulls) throws JsonException { try { ObjectMapper mapper = create(dateFormat, serializeNulls); return mapper.readValue(json, mapper.constructType(type)); } catch (IOException e) { throw new JsonException(e); } } @Override public String formatJson(Object obj, boolean serializeNulls) { return formatJson(obj, (String) null, serializeNulls); } @Override public String formatJson(Object obj, String dateFormat, boolean serializeNulls) { try { return create(dateFormat, serializeNulls).writeValueAsString(obj); } catch (IOException e) { throw new RuntimeException(e); } } @Override public String formatJson(Object obj, Type type, boolean serializeNulls) { return formatJson(obj, type, null, serializeNulls); } @Override public String formatJson(Object obj, Type type, String dateFormat, boolean serializeNulls) { try { return create(dateFormat, serializeNulls).writeValueAsString(obj); } catch (IOException e) { throw new RuntimeException(e); } } protected ObjectMapper create(String dateFormat, boolean serializeNulls) { ObjectMapper ret = new ObjectMapper(); if (dateFormat != null) { ret.setDateFormat(new SimpleDateFormat(dateFormat)); } if (serializeNulls) { ret.setSerializationInclusion(Inclusion.ALWAYS); } else { ret.setSerializationInclusion(Inclusion.NON_NULL); } return ret; } }