in johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java [119:203]
public void doWriteObject(Object object, JsonGenerator generator, boolean writeBody, final Collection<String> ignoredProperties,
JsonPointerTracker jsonPointer) {
try {
if (object instanceof Map) {
if (writeBody) {
generator.writeStartObject();
}
writeMapBody((Map<?, ?>) object, null);
if (writeBody) {
generator.writeEnd();
}
return;
}
if (writePrimitives(object)) {
return;
}
final Class<?> objectClass = object.getClass();
if (Enum.class.isAssignableFrom(objectClass)) {
final Adapter adapter = config.findAdapter(objectClass);
final String adaptedValue = adapter.from(object).toString(); // we know it ends as String for enums
generator.write(adaptedValue);
return;
}
if (objectClass.isArray()) {
final Adapter adapter = config.findAdapter(objectClass);
writeArray(objectClass, adapter, null, object, ignoredProperties, jsonPointer);
return;
}
if (object instanceof Iterable) {
doWriteIterable((Iterable) object, ignoredProperties, jsonPointer);
return;
}
Mappings.ClassMapping classMapping = mappings.getClassMapping(objectClass); // don't create here!
if (classMapping != null) {
if (classMapping.adapter != null) {
final Object result = classMapping.adapter.from(object);
doWriteObject(result, generator, writeBody, ignoredProperties, jsonPointer);
return;
}
} else {
final Adapter adapter = config.findAdapter(objectClass);
if (adapter != null) {
doWriteObject(adapter.from(object), generator, writeBody, ignoredProperties, jsonPointer);
return;
}
}
ObjectConverter.Writer objectConverter = config.findObjectConverterWriter(objectClass);
if (writeBody && objectConverter != null) {
if (!writeBody) {
objectConverter.writeJson(object, this);
} else {
writeWithObjectConverter(new DynamicMappingGenerator(this,
generator::writeStartObject, generator::writeEnd, null), objectConverter, object);
}
} else {
if (classMapping == null) { // will be created anyway now so force it and if it has an adapter respect it
classMapping = mappings.findOrCreateClassMapping(objectClass);
}
if (classMapping.adapter != null) {
final Object result = classMapping.adapter.from(object);
doWriteObject(result, generator, writeBody, ignoredProperties, jsonPointer);
return;
}
if (writeBody) {
generator.writeStartObject();
}
final boolean writeEnd = doWriteObjectBody(object, ignoredProperties, jsonPointer, generator);
if (writeEnd && writeBody) {
generator.writeEnd();
}
}
} catch (final InvocationTargetException | IllegalAccessException e) {
throw new MapperException(e);
}
}