From 06d5264ee9f9d040aaa35c489b35f6d1b2807e44 Mon Sep 17 00:00:00 2001 From: fmartelli Date: Thu, 20 Mar 2014 11:54:11 +0100 Subject: [PATCH] [OLINGO-175] fix for json array property retrieve --- .../olingo/fit/utils/JSONUtilities.java | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/fit/src/main/java/org/apache/olingo/fit/utils/JSONUtilities.java b/fit/src/main/java/org/apache/olingo/fit/utils/JSONUtilities.java index a58f3d287..79d2d8fe0 100644 --- a/fit/src/main/java/org/apache/olingo/fit/utils/JSONUtilities.java +++ b/fit/src/main/java/org/apache/olingo/fit/utils/JSONUtilities.java @@ -181,7 +181,7 @@ public class JSONUtilities extends AbstractUtilities { throws Exception { final ObjectMapper mapper = new ObjectMapper(); final JsonNode srcNode = mapper.readTree(src); - JsonNode node = getProperty(srcNode, path, 0); + JsonNode node = getProperty(srcNode, path); return IOUtils.toInputStream(node.asText()); } @@ -202,8 +202,11 @@ public class JSONUtilities extends AbstractUtilities { propertyNode.put(JSON_ODATAMETADATA_NAME, ODATA_METADATA_PREFIX + edmType); } - JsonNode jsonNode = getProperty(srcNode, path, 0); - if (jsonNode.isObject()) { + JsonNode jsonNode = getProperty(srcNode, path); + + if (jsonNode.isArray()) { + propertyNode.put("value", (ArrayNode) jsonNode); + } else if (jsonNode.isObject()) { propertyNode.putAll((ObjectNode) jsonNode); } else { propertyNode.put("value", jsonNode.asText()); @@ -218,20 +221,18 @@ public class JSONUtilities extends AbstractUtilities { return res; } - private JsonNode getProperty(final JsonNode node, final List path, final int index) + private JsonNode getProperty(final JsonNode node, final List path) throws NotFoundException { - final Iterator> iter = node.fields(); - while (iter.hasNext()) { - final Map.Entry entry = iter.next(); - if (path.get(index).equals(entry.getKey())) { - if (path.size() - 1 == index) { - return entry.getValue(); - } else { - return getProperty(entry.getValue(), path, index + 1); - } + + JsonNode propertyNode = node; + for (int i = 0; i < path.size(); i++) { + propertyNode = propertyNode.get(path.get(i)); + if (propertyNode == null) { + throw new NotFoundException(); } } - throw new NotFoundException(); + + return propertyNode; } public InputStream addJsonInlinecount(