package sh.calaba.org.codehaus.jackson.map.ser.impl; import sh.calaba.org.codehaus.jackson.JsonGenerator; import sh.calaba.org.codehaus.jackson.map.JsonMappingException; import sh.calaba.org.codehaus.jackson.map.JsonSerializer; import sh.calaba.org.codehaus.jackson.map.SerializerProvider; import sh.calaba.org.codehaus.jackson.map.ser.*; import sh.calaba.org.codehaus.jackson.type.JavaType; /** * Variant of {@link BeanPropertyWriter} which will handle unwrapping * of JSON Object (including of properties of Object within surrounding * JSON object, and not as sub-object). * * @since 1.9 */ public class UnwrappingBeanPropertyWriter extends BeanPropertyWriter { public UnwrappingBeanPropertyWriter(BeanPropertyWriter base) { super(base); } public UnwrappingBeanPropertyWriter(BeanPropertyWriter base, JsonSerializer ser) { super(base, ser); } @Override public BeanPropertyWriter withSerializer(JsonSerializer ser) { if (getClass() != UnwrappingBeanPropertyWriter.class) { throw new IllegalStateException("UnwrappingBeanPropertyWriter sub-class does not override 'withSerializer()'; needs to!"); } // better try to create unwrapping instance if (!ser.isUnwrappingSerializer()) { ser = ser.unwrappingSerializer(); } return new UnwrappingBeanPropertyWriter(this, ser); } @Override public void serializeAsField(Object bean, JsonGenerator jgen, SerializerProvider prov) throws Exception { Object value = get(bean); if (value == null) { /* Hmmh. I assume we MUST pretty much suppress nulls, since we * can't really unwrap it... */ return; } // For non-nulls, first: simple check for direct cycles if (value == bean) { _reportSelfReference(bean); } if (_suppressableValue != null && _suppressableValue.equals(value)) { return; } JsonSerializer ser = _serializer; if (ser == null) { Class cls = value.getClass(); PropertySerializerMap map = _dynamicSerializers; ser = map.serializerFor(cls); if (ser == null) { ser = _findAndAddDynamic(map, cls, prov); } } // note: must verify we are using unwrapping serializer; if not, will write field name if (!ser.isUnwrappingSerializer()) { jgen.writeFieldName(_name); } if (_typeSerializer == null) { ser.serialize(value, jgen, prov); } else { ser.serializeWithType(value, jgen, prov, _typeSerializer); } } // need to override as we must get unwrapping instance... @Override protected JsonSerializer _findAndAddDynamic(PropertySerializerMap map, Class type, SerializerProvider provider) throws JsonMappingException { JsonSerializer serializer; if (_nonTrivialBaseType != null) { JavaType subtype = provider.constructSpecializedType(_nonTrivialBaseType, type); serializer = provider.findValueSerializer(subtype, this); } else { serializer = provider.findValueSerializer(type, this); } if (!serializer.isUnwrappingSerializer()) { serializer = serializer.unwrappingSerializer(); } _dynamicSerializers = _dynamicSerializers.newWith(type, serializer); return serializer; } }