in sdk/core/azure-core-jackson/src/main/java/com/azure/android/core/serde/jackson/FlatteningSerializer.java [164:230]
public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
if (value == null) {
jgen.writeNull();
return;
}
escapeMapKeys(value);
// BFS for all collapsed properties
ObjectNode root = mapper.valueToTree(value);
ObjectNode res = root.deepCopy();
Queue<ObjectNode> source = new LinkedBlockingQueue<ObjectNode>();
Queue<ObjectNode> target = new LinkedBlockingQueue<ObjectNode>();
source.add(root);
target.add(res);
while (!source.isEmpty()) {
ObjectNode current = source.poll();
ObjectNode resCurrent = target.poll();
Iterator<Map.Entry<String, JsonNode>> fields = current.fields();
while (fields.hasNext()) {
Map.Entry<String, JsonNode> field = fields.next();
ObjectNode node = resCurrent;
String key = field.getKey();
JsonNode outNode = resCurrent.get(key);
if (CHECK_IF_FLATTEN_PROPERTY_PATTERN.matcher(key).matches()) {
// Handle flattening properties
//
String[] values = UNESCAPED_PERIOD_PATTERN.split(key);
for (int i = 0; i < values.length; ++i) {
values[i] = values[i].replace("\\.", ".");
if (i == values.length - 1) {
break;
}
String val = values[i];
if (node.has(val)) {
node = (ObjectNode) node.get(val);
} else {
ObjectNode child = new ObjectNode(JsonNodeFactory.instance);
node.put(val, child);
node = child;
}
}
node.set(values[values.length - 1], resCurrent.get(key));
resCurrent.remove(key);
outNode = node.get(values[values.length - 1]);
} else if (CHECK_IF_ESCAPED_MAP_PATTERN.matcher(key).matches()) {
// Handle escaped map key
//
String originalKey = REPLACE_ESCAPED_MAP_PATTERN.matcher(key).replaceAll(".");
resCurrent.remove(key);
resCurrent.put(originalKey, outNode);
}
if (field.getValue() instanceof ObjectNode) {
source.add((ObjectNode) field.getValue());
target.add((ObjectNode) outNode);
} else if (field.getValue() instanceof ArrayNode
&& (field.getValue()).size() > 0
&& (field.getValue()).get(0) instanceof ObjectNode) {
Iterator<JsonNode> sourceIt = field.getValue().elements();
Iterator<JsonNode> targetIt = outNode.elements();
while (sourceIt.hasNext()) {
source.add((ObjectNode) sourceIt.next());
target.add((ObjectNode) targetIt.next());
}
}
}
}
jgen.writeTree(res);
}