in tooling/camel-util-json/src/main/java/org/apache/camel/util/json/Jsoner.java [938:1191]
private static void serialize(
final Object jsonSerializable, final Writer writableDestination, final Set<SerializationOptions> flags)
throws IOException {
if (jsonSerializable == null) {
/* When a null is passed in the word null is supported in JSON. */
writableDestination.write("null");
} else if (jsonSerializable instanceof Jsonable && flags.contains(SerializationOptions.ALLOW_JSONABLES)) {
/* Writes the writable as defined by the writable. */
((Jsonable) jsonSerializable).toJson(writableDestination);
} else if (jsonSerializable instanceof Enum
&& flags.contains(SerializationOptions.ALLOW_FULLY_QUALIFIED_ENUMERATIONS)) {
/*
* Writes the enum as a special case of string. All enums (unless
* they implement Jsonable) will be the string literal
* "${DECLARING_CLASS_NAME}.${ENUM_NAME}" as their value.
*/
@SuppressWarnings("rawtypes")
final Enum e = (Enum) jsonSerializable;
writableDestination.write('"');
writableDestination.write(e.getDeclaringClass().getName());
writableDestination.write('.');
writableDestination.write(e.name());
writableDestination.write('"');
} else if (jsonSerializable instanceof String) {
/* Make sure the string is properly escaped. */
writableDestination.write('"');
writableDestination.write(Jsoner.escape((String) jsonSerializable));
writableDestination.write('"');
} else if (jsonSerializable instanceof Double) {
if (((Double) jsonSerializable).isInfinite() || ((Double) jsonSerializable).isNaN()) {
/*
* Infinite and not a number are not supported by the JSON
* specification, so null is used instead.
*/
writableDestination.write("null");
} else {
writableDestination.write(jsonSerializable.toString());
}
} else if (jsonSerializable instanceof Float) {
if (((Float) jsonSerializable).isInfinite() || ((Float) jsonSerializable).isNaN()) {
/*
* Infinite and not a number are not supported by the JSON
* specification, so null is used instead.
*/
writableDestination.write("null");
} else {
writableDestination.write(jsonSerializable.toString());
}
} else if (jsonSerializable instanceof Number) {
writableDestination.write(jsonSerializable.toString());
} else if (jsonSerializable instanceof Boolean) {
writableDestination.write(jsonSerializable.toString());
} else if (jsonSerializable instanceof Map) {
/* Writes the map in JSON object format. */
boolean isFirstEntry = true;
@SuppressWarnings("rawtypes")
final Iterator entries = ((Map) jsonSerializable).entrySet().iterator();
writableDestination.write('{');
while (entries.hasNext()) {
if (isFirstEntry) {
isFirstEntry = false;
} else {
writableDestination.write(',');
}
@SuppressWarnings("rawtypes")
final Map.Entry entry = (Map.Entry) entries.next();
Jsoner.serialize(entry.getKey(), writableDestination, flags);
writableDestination.write(':');
Jsoner.serialize(entry.getValue(), writableDestination, flags);
}
writableDestination.write('}');
} else if (jsonSerializable instanceof Collection) {
/* Writes the collection in JSON array format. */
boolean isFirstElement = true;
@SuppressWarnings("rawtypes")
final Iterator elements = ((Collection) jsonSerializable).iterator();
writableDestination.write('[');
while (elements.hasNext()) {
if (isFirstElement) {
isFirstElement = false;
} else {
writableDestination.write(',');
}
Jsoner.serialize(elements.next(), writableDestination, flags);
}
writableDestination.write(']');
} else if (jsonSerializable instanceof byte[]) {
/* Writes the array in JSON array format. */
final byte[] writableArray = (byte[]) jsonSerializable;
final int numberOfElements = writableArray.length;
writableDestination.write('[');
for (int i = 0; i < numberOfElements; i++) {
if (i == (numberOfElements - 1)) {
Jsoner.serialize(writableArray[i], writableDestination, flags);
} else {
Jsoner.serialize(writableArray[i], writableDestination, flags);
writableDestination.write(',');
}
}
writableDestination.write(']');
} else if (jsonSerializable instanceof short[]) {
/* Writes the array in JSON array format. */
final short[] writableArray = (short[]) jsonSerializable;
final int numberOfElements = writableArray.length;
writableDestination.write('[');
for (int i = 0; i < numberOfElements; i++) {
if (i == (numberOfElements - 1)) {
Jsoner.serialize(writableArray[i], writableDestination, flags);
} else {
Jsoner.serialize(writableArray[i], writableDestination, flags);
writableDestination.write(',');
}
}
writableDestination.write(']');
} else if (jsonSerializable instanceof int[]) {
/* Writes the array in JSON array format. */
final int[] writableArray = (int[]) jsonSerializable;
final int numberOfElements = writableArray.length;
writableDestination.write('[');
for (int i = 0; i < numberOfElements; i++) {
if (i == (numberOfElements - 1)) {
Jsoner.serialize(writableArray[i], writableDestination, flags);
} else {
Jsoner.serialize(writableArray[i], writableDestination, flags);
writableDestination.write(',');
}
}
writableDestination.write(']');
} else if (jsonSerializable instanceof long[]) {
/* Writes the array in JSON array format. */
final long[] writableArray = (long[]) jsonSerializable;
final int numberOfElements = writableArray.length;
writableDestination.write('[');
for (int i = 0; i < numberOfElements; i++) {
if (i == (numberOfElements - 1)) {
Jsoner.serialize(writableArray[i], writableDestination, flags);
} else {
Jsoner.serialize(writableArray[i], writableDestination, flags);
writableDestination.write(',');
}
}
writableDestination.write(']');
} else if (jsonSerializable instanceof float[]) {
/* Writes the array in JSON array format. */
final float[] writableArray = (float[]) jsonSerializable;
final int numberOfElements = writableArray.length;
writableDestination.write('[');
for (int i = 0; i < numberOfElements; i++) {
if (i == (numberOfElements - 1)) {
Jsoner.serialize(writableArray[i], writableDestination, flags);
} else {
Jsoner.serialize(writableArray[i], writableDestination, flags);
writableDestination.write(',');
}
}
writableDestination.write(']');
} else if (jsonSerializable instanceof double[]) {
/* Writes the array in JSON array format. */
final double[] writableArray = (double[]) jsonSerializable;
final int numberOfElements = writableArray.length;
writableDestination.write('[');
for (int i = 0; i < numberOfElements; i++) {
if (i == (numberOfElements - 1)) {
Jsoner.serialize(writableArray[i], writableDestination, flags);
} else {
Jsoner.serialize(writableArray[i], writableDestination, flags);
writableDestination.write(',');
}
}
writableDestination.write(']');
} else if (jsonSerializable instanceof boolean[]) {
/* Writes the array in JSON array format. */
final boolean[] writableArray = (boolean[]) jsonSerializable;
final int numberOfElements = writableArray.length;
writableDestination.write('[');
for (int i = 0; i < numberOfElements; i++) {
if (i == (numberOfElements - 1)) {
Jsoner.serialize(writableArray[i], writableDestination, flags);
} else {
Jsoner.serialize(writableArray[i], writableDestination, flags);
writableDestination.write(',');
}
}
writableDestination.write(']');
} else if (jsonSerializable instanceof char[]) {
/* Writes the array in JSON array format. */
final char[] writableArray = (char[]) jsonSerializable;
final int numberOfElements = writableArray.length;
writableDestination.write("[\"");
for (int i = 0; i < numberOfElements; i++) {
if (i == (numberOfElements - 1)) {
Jsoner.serialize(writableArray[i], writableDestination, flags);
} else {
Jsoner.serialize(writableArray[i], writableDestination, flags);
writableDestination.write("\",\"");
}
}
writableDestination.write("\"]");
} else if (jsonSerializable instanceof Object[]) {
/* Writes the array in JSON array format. */
final Object[] writableArray = (Object[]) jsonSerializable;
final int numberOfElements = writableArray.length;
writableDestination.write('[');
for (int i = 0; i < numberOfElements; i++) {
if (i == (numberOfElements - 1)) {
Jsoner.serialize(writableArray[i], writableDestination, flags);
} else {
Jsoner.serialize(writableArray[i], writableDestination, flags);
writableDestination.write(",");
}
}
writableDestination.write(']');
} else {
/*
* TODO a potential feature for future release since POJOs are often
* represented as JsonObjects. It would be nice to have a flag that
* tries to reflectively figure out what a non-Jsonable POJO's
* fields are and use their names as keys and their respective
* values for the keys' values in the JsonObject? Naturally
* implementing Jsonable is safer and in many ways makes this
* feature a convenience for not needing to implement Jsonable for
* very simple POJOs. If it fails to produce a JsonObject to
* serialize it should defer to replacements if allowed. If
* replacement fails it should defer to invalids if allowed. This
* feature would require another serialize method exposed to allow
* this serialization. This feature (although perhaps useful on its
* own) would also include a method in the JsonObject where you pass
* it a class and it would do its best to instantiate a POJO of the
* class using the keys in the JsonObject.
*/
/*
* It cannot by any measure be safely serialized according to
* specification.
*/
if (flags.contains(SerializationOptions.ALLOW_INVALIDS_NOOP)) {
// noop marker
writableDestination.write("SerializationOptions.ALLOW_INVALIDS_NOOP");
} else if (flags.contains(SerializationOptions.ALLOW_INVALIDS)) {
/* Can be helpful for debugging how it isn't valid. */
writableDestination.write(jsonSerializable.toString());
} else {
/*
* Notify the caller the cause of failure for the serialization.
*/
throw new IllegalArgumentException(
"Encountered a: " + jsonSerializable.getClass().getName() + " as: " + jsonSerializable
+ " that isn't JSON serializable.\n Try:\n"
+ " 1) Implementing the Jsonable interface for the object to return valid JSON. If it already does it probably has a bug.\n"
+ " 2) If you cannot edit the source of the object or couple it with this library consider wrapping it in a class that does implement the Jsonable interface.\n"
+ " 3) Otherwise convert it to a boolean, null, number, JsonArray, JsonObject, or String value before serializing it.\n"
+ " 4) If you feel it should have serialized you could use a more tolerant serialization for debugging purposes.");
}
}
}