@Override public JsonObject get(final JsonFieldSelector fieldSelector) { requireNonNull(fieldSelector, "The JSON field selector must not be null!"); if (isEmpty()) { return this; } final List<JsonPointer> pointersContainedInThis = fieldSelector.getPointers() .stream() .filter(this::contains) .collect(Collectors.toList()); if (pointersContainedInThis.isEmpty()) { return empty(); } else { return filterByTrie(this, JsonFieldSelectorTrie.of(pointersContainedInThis)); } }
@Override public JsonObject get(final JsonFieldSelector fieldSelector) { requireNonNull(fieldSelector, "The JSON field selector must not be null!"); if (isEmpty()) { return this; } final List<JsonPointer> pointersContainedInThis = fieldSelector.getPointers() .stream() .filter(this::contains) .collect(Collectors.toList()); if (pointersContainedInThis.isEmpty()) { return JsonFactory.newObject(); } else { return filterByTrie(this, JsonFieldSelectorTrie.of(pointersContainedInThis)); } }
@SuppressWarnings("unchecked") private static JsonObject filterByTrie(final JsonObject self, final JsonFieldSelectorTrie trie) { if (trie.isEmpty()) { return self; } final JsonObjectBuilder builder = JsonObject.newBuilder(); for (final JsonKey key : trie.getKeys()) { self.getField(key).ifPresent(child -> { final JsonValue childValue = child.getValue(); final JsonValue filteredChildValue = childValue.isObject() ? filterByTrie(childValue.asObject(), trie.descend(key)) : childValue; final Optional<JsonFieldDefinition> childFieldDefinition = child.getDefinition(); if (childFieldDefinition.isPresent()) { builder.set(childFieldDefinition.get(), filteredChildValue); } else { builder.set(key, filteredChildValue); } }); } return builder.build(); }
@SuppressWarnings("unchecked") private static JsonObject filterByTrie(final JsonObject self, final JsonFieldSelectorTrie trie) { if (trie.isEmpty()) { return self; } final JsonObjectBuilder builder = JsonFactory.newObjectBuilder(); for (final JsonKey key : trie.getKeys()) { self.getField(key).ifPresent(child -> { final JsonValue childValue = child.getValue(); final JsonValue filteredChildValue = childValue.isObject() ? filterByTrie(childValue.asObject(), trie.descend(key)) : childValue; final Optional<JsonFieldDefinition> childFieldDefinition = child.getDefinition(); if (childFieldDefinition.isPresent()) { builder.set(childFieldDefinition.get(), filteredChildValue); } else { builder.set(key, filteredChildValue); } }); } return builder.build(); }