diff --git a/metafacture-json/src/main/java/org/metafacture/json/JsonDecoder.java b/metafacture-json/src/main/java/org/metafacture/json/JsonDecoder.java index f6dbd2238..6cb795fee 100644 --- a/metafacture-json/src/main/java/org/metafacture/json/JsonDecoder.java +++ b/metafacture-json/src/main/java/org/metafacture/json/JsonDecoder.java @@ -33,7 +33,7 @@ import java.io.IOException; import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Decodes a record in JSON format. @@ -132,21 +132,27 @@ public void resetRecordCount() { @Override public void process(final String json) { assert !isClosed(); - final List records = recordPath.isEmpty() ? Arrays.asList(json) - : matches(JsonPath.read(json, recordPath)); - records.forEach(record -> { - createParser(record); - try { - decode(); - } catch (final IOException e) { - throw new MetafactureException(e); - } finally { - closeParser(); - } - }); + if (recordPath.isEmpty()) { + processRecord(json); + } else { + matches(JsonPath.read(json, recordPath)).forEach(record -> { + processRecord(record); + }); + } + } + + private void processRecord(String record) { + createParser(record); + try { + decode(); + } catch (final IOException e) { + throw new MetafactureException(e); + } finally { + closeParser(); + } } - private List matches(Object obj) { + private Stream matches(Object obj) { final List records = (obj instanceof List) ? ((List) obj) : Arrays.asList(obj); return records.stream().map(doc -> { try { @@ -155,7 +161,7 @@ private List matches(Object obj) { e.printStackTrace(); return doc.toString(); } - }).collect(Collectors.toList()); + }); } @Override diff --git a/metafacture-json/src/test/java/org/metafacture/json/JsonDecoderTest.java b/metafacture-json/src/test/java/org/metafacture/json/JsonDecoderTest.java index 67cd3a3a8..8d14bb466 100644 --- a/metafacture-json/src/test/java/org/metafacture/json/JsonDecoderTest.java +++ b/metafacture-json/src/test/java/org/metafacture/json/JsonDecoderTest.java @@ -152,7 +152,7 @@ public void testShouldProcessConcatenatedRecords() { } @Test - public void testShouldProcessRecordsInArray() { + public void testShouldProcessRecordsInArrayField() { jsonDecoder.setRecordPath("$.data"); jsonDecoder.process( "{\"data\":[" + "{\"lit\": \"record 1\"}," + @@ -167,6 +167,29 @@ public void testShouldProcessRecordsInArray() { ordered.verify(receiver).endRecord(); } + @Test + public void testShouldProcessRecordsInArrayRoot() { + jsonDecoder.setRecordPath("$"); + jsonDecoder.process( + "[" + "{\"lit\": \"record 1\"}," + + "{\"lit\": \"record 2\"}" + "]"); + + final InOrder ordered = inOrder(receiver); + ordered.verify(receiver).startRecord("1"); + ordered.verify(receiver).literal("lit", "record 1"); + ordered.verify(receiver).endRecord(); + ordered.verify(receiver).startRecord("2"); + ordered.verify(receiver).literal("lit", "record 2"); + ordered.verify(receiver).endRecord(); + } + + @Test(expected=MetafactureException.class) + public void testRootArrayNoRecordPath() { + jsonDecoder.process( + "[" + "{\"lit\": \"record 1\"}," + + "{\"lit\": \"record 2\"}" + "]"); + } + @Test public void testShouldProcessMultipleRecords() { jsonDecoder.process("{\"lit\": \"record 1\"}");