private Object getProperty(Object obj, Object key) { if (obj instanceof Map) { return ((Map) obj).get(key); } else if (obj instanceof List) { int idx = key instanceof Integer ? (Integer) key : Integer.parseInt(key.toString()); return ((List) obj).get(idx); } else if (obj instanceof ObjectNode) { return unwrap(((ObjectNode) obj).get(key.toString())); } else if (obj instanceof ArrayNode) { int idx = key instanceof Integer ? (Integer) key : Integer.parseInt(key.toString()); return unwrap(((ArrayNode) obj).get(idx)); } else { return getProperty(mapper.convertValue(obj, JsonNode.class), key); } }
return getPropertyKeys(mapper.convertValue(obj, JsonNode.class));
@Override public int length(Object obj) { if (obj instanceof List) { return ((List) obj).size(); } else if (obj instanceof Map) { return ((Map) obj).size(); } else if (obj instanceof ArrayNode) { return ((ArrayNode) obj).size(); } else if (obj instanceof ObjectNode) { return ((ObjectNode) obj).size(); } else { return length(mapper.convertValue(obj, JsonNode.class)); } }
@Override public void setProperty(Object obj, Object key, Object value) { if (obj instanceof Map) { ((Map) obj).put(key, value); } else if (obj instanceof List) { int idx = key instanceof Integer ? (Integer) key : Integer.parseInt(key.toString()); ((List) obj).add(idx, value); } else if (obj instanceof ObjectNode) { ((ObjectNode) obj).set(key.toString(), (JsonNode) value); } else if (obj instanceof ArrayNode) { int idx = key instanceof Integer ? (Integer) key : Integer.parseInt(key.toString()); ((ArrayNode) obj).set(idx, (JsonNode) value); } else { setProperty(mapper.convertValue(obj, JsonNode.class), key, value); } }
@Override public Object getMapValue(Object obj, String key) { return getProperty(obj, key); }
@Override public Object getArrayIndex(Object obj, int idx) { return getProperty(obj, idx); }
@Override public void setArrayIndex(Object array, int idx, Object newValue) { setProperty(array, idx, newValue); }
@Override public Object unwrap(Object object) { if (object instanceof JsonNode) { return unwrap((JsonNode) object); } else { return object; } }
@Override public void removeProperty(Object obj, Object key) { setProperty(obj, key, null); }
@Override public Iterable<Object> toIterable(Object obj) { if (obj instanceof List || obj instanceof JsonNode) { return (Iterable<Object>) obj; } else if (obj instanceof Map) { return ((Map) obj).values(); } else { return toIterable(mapper.convertValue(obj, JsonNode.class)); } }
@Override public Object getArrayIndex(Object obj, int idx, boolean unwrap) { Object o = getProperty(obj, idx); if (o instanceof JsonNode && unwrap) { return unwrap((JsonNode) o); } else { return o; } }
public JsonPathSelector(ObjectMapper mapper, String jsonPath, Filter... filters) { super(JsonPath.compile(jsonPath, filters)); this.mapper = mapper; this.jsonPathConfig = Configuration.builder().jsonProvider(new Jackson2JsonProvider(mapper)).build(); }