in johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingGeneratorImpl.java [439:522]
private void writeValue(final Class<?> type, final boolean dynamic,
final boolean primitive, final boolean array,
final boolean collection, final boolean map,
final Adapter itemConverter,
final String key, final Object value,
final ObjectConverter.Writer objectConverter,
final Collection<String> ignoredProperties,
final JsonPointerTracker jsonPointer,
final JsonGenerator generator)
throws InvocationTargetException, IllegalAccessException {
//CHECKSTYLE:ON
if (config.getSerializeValueFilter().shouldIgnore(key, value)) {
return;
}
if ((!dynamic && array) || (dynamic && type.isArray())) {
writeArray(type, itemConverter, key, value, ignoredProperties, jsonPointer);
} else if ((!dynamic && collection) || (dynamic && Iterable.class.isAssignableFrom(type))) {
writeIterator(itemConverter, key, objectConverter, ignoredProperties, jsonPointer, generator,
Iterable.class.cast(value).iterator(), value);
} else if ((!dynamic && map) || (dynamic && Map.class.isAssignableFrom(type))) {
generator.writeStartObject(key);
if (objectConverter != null) {
writeWithObjectConverter(new DynamicMappingGenerator(this,
() -> this.generator.writeStartObject(key), this.generator::writeEnd, key), objectConverter, value);
} else {
writeMapBody((Map<?, ?>) value, itemConverter);
}
generator.writeEnd();
} else if ((!dynamic && primitive) || (dynamic && Mappings.isPrimitive(type))) {
if (objectConverter != null) {
writeWithObjectConverter(new DynamicMappingGenerator(this,
() -> this.generator.writeStartObject(key), this.generator::writeEnd, key), objectConverter, value);
} else {
writePrimitives(key, type, value, generator);
}
} else if (BaseStream.class.isAssignableFrom(type)) {
writeIterator(itemConverter, key, objectConverter, ignoredProperties, jsonPointer, generator,
BaseStream.class.cast(value).iterator(), value);
} else if (Iterator.class.isAssignableFrom(type)) {
if (objectConverter != null) {
generator.writeStartObject(key);
writeWithObjectConverter(new DynamicMappingGenerator(this,
() -> this.generator.writeStartObject(key), this.generator::writeEnd, key), objectConverter, value);
generator.writeEnd();
} else {
writeIterator(itemConverter, key, objectConverter, ignoredProperties, jsonPointer, generator,
Iterator.class.cast(value), value);
}
} else {
if (objectConverter != null) {
writeWithObjectConverter(new DynamicMappingGenerator(this,
() -> this.generator.writeStartObject(key), this.generator::writeEnd, key), objectConverter, value);
return;
}
final Adapter converter = config.findAdapter(type);
if (converter != null) {
final Object adapted = doConvertFrom(value, converter);
if (writePrimitives(key, adapted.getClass(), adapted, generator)) {
return;
}
writeValue(String.class, true, true, false, false, false, null, key, adapted, null, ignoredProperties, jsonPointer, generator);
return;
} else {
ObjectConverter.Writer objectConverterToUse = objectConverter;
if (objectConverterToUse == null) {
objectConverterToUse = config.findObjectConverterWriter(type);
}
if (objectConverterToUse != null) {
writeWithObjectConverter(new DynamicMappingGenerator(this,
() -> this.generator.writeStartObject(key), this.generator::writeEnd, key), objectConverterToUse, value);
return;
}
}
if (writePrimitives(key, type, value, generator)) {
return;
}
generator.writeStartObject(key);
if (doWriteObjectBody(value, ignoredProperties, jsonPointer, generator)) {
generator.writeEnd();
}
}
}