in johnzon-mapper/src/main/java/org/apache/johnzon/mapper/JsonObjectGenerator.java [190:259]
public JsonGenerator writeEnd() {
if (builders.size() == 1) {
return this;
}
final Object last = builders.removeLast();
/*
* Previous potential cases:
* 1. json array -> we add the builder directly
* 2. NamedBuilder{array|object} -> we add the builder in the previous object
*/
final String name;
Object previous = builders.getLast();
if (NamedBuilder.class.isInstance(previous)) {
final NamedBuilder namedBuilder = NamedBuilder.class.cast(previous);
name = namedBuilder.name;
previous = namedBuilder.builder;
} else {
name = null;
}
if (JsonArrayBuilder.class.isInstance(last)) {
final JsonArrayBuilder array = JsonArrayBuilder.class.cast(last);
if (JsonArrayBuilder.class.isInstance(previous)) {
arrayBuilder = JsonArrayBuilder.class.cast(previous);
objectBuilder = null;
arrayBuilder.add(array);
} else if (JsonObjectBuilder.class.isInstance(previous)) {
objectBuilder = JsonObjectBuilder.class.cast(previous);
arrayBuilder = null;
objectBuilder.add(name, array);
} else {
throw new IllegalArgumentException("Unsupported previous builder: " + previous);
}
} else if (JsonObjectBuilder.class.isInstance(last)) {
final JsonObjectBuilder object = JsonObjectBuilder.class.cast(last);
if (JsonArrayBuilder.class.isInstance(previous)) {
arrayBuilder = JsonArrayBuilder.class.cast(previous);
objectBuilder = null;
arrayBuilder.add(object);
} else if (JsonObjectBuilder.class.isInstance(previous)) {
objectBuilder = JsonObjectBuilder.class.cast(previous);
arrayBuilder = null;
objectBuilder.add(name, object);
} else {
throw new IllegalArgumentException("Unsupported previous builder: " + previous);
}
} else if (NamedBuilder.class.isInstance(last)) {
final NamedBuilder<?> namedBuilder = NamedBuilder.class.cast(last);
if (JsonObjectBuilder.class.isInstance(previous)) {
objectBuilder = JsonObjectBuilder.class.cast(previous);
if (JsonArrayBuilder.class.isInstance(namedBuilder.builder)) {
objectBuilder.add(namedBuilder.name, JsonArrayBuilder.class.cast(namedBuilder.builder));
arrayBuilder = null;
} else if (JsonObjectBuilder.class.isInstance(namedBuilder.builder)) {
objectBuilder.add(namedBuilder.name, JsonObjectBuilder.class.cast(namedBuilder.builder));
arrayBuilder = null;
} else {
throw new IllegalArgumentException("Unsupported previous builder: " + previous);
}
} else {
throw new IllegalArgumentException("Unsupported previous builder, expected object builder: " + previous);
}
} else {
throw new IllegalArgumentException("Unsupported previous builder: " + previous);
}
return this;
}