From 47fcb2303b878e704fd66f6855b7f3745582eb46 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Tue, 8 Dec 2009 18:58:08 +0000 Subject: [PATCH] JSON enhancements git-svn-id: https://svn.argeo.org/commons/trunk@3186 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../server/json/JsonServerSerializer.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerSerializer.java b/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerSerializer.java index 78f3dff94..3d7361396 100644 --- a/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerSerializer.java +++ b/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerSerializer.java @@ -14,7 +14,13 @@ import org.argeo.server.Serializer; import org.argeo.server.ServerSerializer; import org.codehaus.jackson.JsonFactory; import org.codehaus.jackson.JsonGenerator; +import org.codehaus.jackson.map.JsonMappingException; +import org.codehaus.jackson.map.JsonSerializer; import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.map.SerializationConfig; +import org.codehaus.jackson.map.SerializerFactory; +import org.codehaus.jackson.map.SerializerProvider; +import org.codehaus.jackson.map.ser.StdSerializerProvider; public class JsonServerSerializer implements ServerSerializer, Serializer { private final static Log log = LogFactory @@ -22,6 +28,7 @@ public class JsonServerSerializer implements ServerSerializer, Serializer { private JsonFactory jsonFactory = new JsonFactory(); private ObjectMapper objectMapper = new ObjectMapper(); + private SerializerProvider serializerProvider = new CustomSerializerProvider(); private Boolean prettyPrint = false; @@ -29,6 +36,13 @@ public class JsonServerSerializer implements ServerSerializer, Serializer { private String contentTypeCharset = "UTF-8"; + // private Map,String> ignoredFields = new HashMap, + // String>(); + + public JsonServerSerializer() { + objectMapper.setSerializerProvider(serializerProvider); + } + public void serialize(Object obj, HttpServletRequest request, HttpServletResponse response) { if (asHtml) @@ -62,6 +76,7 @@ public class JsonServerSerializer implements ServerSerializer, Serializer { jsonGenerator.useDefaultPrettyPrinter(); objectMapper.writeValue(jsonGenerator, obj); + jsonGenerator.flush(); } catch (Exception e) { throw new ArgeoException("Cannot serialize " + obj, e); } finally { @@ -113,4 +128,43 @@ public class JsonServerSerializer implements ServerSerializer, Serializer { this.contentTypeCharset = contentTypeCharset; } + static class CustomSerializerProvider extends StdSerializerProvider { + + public CustomSerializerProvider() { + super(); + } + + public CustomSerializerProvider(SerializationConfig config, + StdSerializerProvider src, SerializerFactory f) { + super(config, src, f); + } + + protected StdSerializerProvider createInstance( + SerializationConfig config, SerializerFactory jsf) { + return new CustomSerializerProvider(config, this, jsf); + } + + @Override + public JsonSerializer getUnknownTypeSerializer( + Class unknownType) { + JsonSerializer res = new JsonSerializer() { + public void serialize(Object value, JsonGenerator jgen, + SerializerProvider provider) + throws JsonMappingException { + if (log.isDebugEnabled()) + log.warn("Unknown serializer for " + + value.getClass().getName()); + try { + jgen.writeNull(); + } catch (Exception e) { + throw new ArgeoException("Cannot write null", e); + } + } + + }; + + return res; + } + + } } -- 2.30.2