Skip to content

Commit 0316128

Browse files
committed
Make JSON encoder array marker configurable.
Allows pass-through in combination with JSON decoder array marker.
1 parent 36d35b1 commit 0316128

File tree

2 files changed

+44
-4
lines changed

2 files changed

+44
-4
lines changed

metafacture-json/src/main/java/org/metafacture/json/JsonEncoder.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@
5050
@In(StreamReceiver.class)
5151
@Out(String.class)
5252
@FluxCommand("encode-json")
53-
public final class JsonEncoder extends
54-
DefaultStreamPipe<ObjectReceiver<String>> {
53+
public final class JsonEncoder extends DefaultStreamPipe<ObjectReceiver<String>> {
5554

5655
public static final String ARRAY_MARKER = "[]";
5756

@@ -61,6 +60,8 @@ public final class JsonEncoder extends
6160
private final JsonGenerator jsonGenerator;
6261
private final StringWriter writer = new StringWriter();
6362

63+
private String arrayMarker = ARRAY_MARKER;
64+
6465
public JsonEncoder() {
6566
try {
6667
jsonGenerator = new JsonFactory().createGenerator(writer);
@@ -71,6 +72,14 @@ public JsonEncoder() {
7172
}
7273
}
7374

75+
public void setArrayMarker(final String arrayMarker) {
76+
this.arrayMarker = arrayMarker;
77+
}
78+
79+
public String getArrayMarker() {
80+
return arrayMarker;
81+
}
82+
7483
public void setPrettyPrinting(final boolean prettyPrinting) {
7584
jsonGenerator.setPrettyPrinter(prettyPrinting ? new DefaultPrettyPrinter((SerializableString) null) : null);
7685
}
@@ -173,9 +182,9 @@ public void literal(final String name, final String value) {
173182
private void startGroup(final String name) {
174183
try {
175184
final JsonStreamContext ctx = jsonGenerator.getOutputContext();
176-
if (name.endsWith(ARRAY_MARKER)) {
185+
if (name.endsWith(arrayMarker)) {
177186
if (ctx.inObject()) {
178-
jsonGenerator.writeFieldName(name.substring(0, name.length() - ARRAY_MARKER.length()));
187+
jsonGenerator.writeFieldName(name.substring(0, name.length() - arrayMarker.length()));
179188
}
180189
jsonGenerator.writeStartArray();
181190
}

metafacture-json/src/test/java/org/metafacture/json/JsonEncoderTest.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,37 @@ public void testShouldEncodeNestedLists() {
158158
verify(receiver).process(fixQuotes("{'Li1':[['V1','V2'],['V3','V4']]}"));
159159
}
160160

161+
@Test
162+
public void testShouldNotEncodeEntitiesWithDifferentMarkerAsList() {
163+
encoder.setArrayMarker("*");
164+
165+
encoder.startRecord("");
166+
encoder.startEntity(LIST1);
167+
encoder.literal(LITERAL1, VALUE1);
168+
encoder.literal(LITERAL2, VALUE2);
169+
encoder.literal(LITERAL3, VALUE3);
170+
encoder.endEntity();
171+
encoder.endRecord();
172+
173+
verify(receiver).process(fixQuotes("{'Li1[]':{'L1':'V1','L2':'V2','L3':'V3'}}"));
174+
}
175+
176+
@Test
177+
public void testShouldEncodeMarkedEntitiesWithConfiguredMarkerAsList() {
178+
final String marker = "*";
179+
encoder.setArrayMarker(marker);
180+
181+
encoder.startRecord("");
182+
encoder.startEntity(LIST1.replace(JsonEncoder.ARRAY_MARKER, marker));
183+
encoder.literal(LITERAL1, VALUE1);
184+
encoder.literal(LITERAL2, VALUE2);
185+
encoder.literal(LITERAL3, VALUE3);
186+
encoder.endEntity();
187+
encoder.endRecord();
188+
189+
verify(receiver).process(fixQuotes("{'Li1':['V1','V2','V3']}"));
190+
}
191+
161192
@Test
162193
public void testShouldOutputDuplicateNames() {
163194
encoder.startRecord("");

0 commit comments

Comments
 (0)