Skip to content

Commit aa24f65

Browse files
committed
Fixed list-handling in JsonEncoder
The JsonEncoder did not correctly encode lists which contained entities or nested lists.
1 parent 5bcc5c7 commit aa24f65

File tree

2 files changed

+96
-14
lines changed

2 files changed

+96
-14
lines changed

src/main/java/org/culturegraph/mf/stream/converter/JsonEncoder.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ public void endEntity() {
8989
@Override
9090
public void literal(final String name, final String value) {
9191
try {
92-
if (jsonGenerator.getOutputContext().inObject()) {
92+
final JsonStreamContext ctx = jsonGenerator.getOutputContext();
93+
if (ctx.inObject()) {
9394
jsonGenerator.writeFieldName(name);
9495
}
9596
if (value == null) {
@@ -109,12 +110,12 @@ private void startGroup(final String name) {
109110
try {
110111
final JsonStreamContext ctx = jsonGenerator.getOutputContext();
111112
if (name.endsWith(ARRAY_MARKER)) {
112-
if (!ctx.inRoot()) {
113+
if (ctx.inObject()) {
113114
jsonGenerator.writeFieldName(name.substring(0, name.length() - ARRAY_MARKER.length()));
114115
}
115116
jsonGenerator.writeStartArray();
116117
} else {
117-
if (!ctx.inRoot()) {
118+
if (ctx.inObject()) {
118119
jsonGenerator.writeFieldName(name);
119120
}
120121
jsonGenerator.writeStartObject();

src/test/java/org/culturegraph/mf/stream/converter/JsonEncoderTest.java

Lines changed: 92 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,23 @@
3232
*/
3333
public final class JsonEncoderTest {
3434

35+
private static final String LITERAL1 = "L1";
36+
private static final String LITERAL2 = "L2";
37+
private static final String LITERAL3 = "L3";
38+
private static final String LITERAL4 = "L4";
39+
40+
private static final String VALUE1 = "V1";
41+
private static final String VALUE2 = "V2";
42+
private static final String VALUE3 = "V3";
43+
private static final String VALUE4 = "V4";
44+
45+
private static final String ENTITY1 = "En1";
46+
private static final String ENTITY2 = "En2";
47+
48+
private static final String LIST1 = "Li1[]";
49+
private static final String LIST2 = "Li2[]";
50+
private static final String LIST3 = "Li3[]";
51+
3552
private JsonEncoder encoder;
3653

3754
@Mock
@@ -51,29 +68,92 @@ public void cleanup() {
5168
}
5269

5370
@Test
54-
public void testShouldEncodeLiteralsAndEntities() {
71+
public void testShouldEncodeLiterals() {
72+
encoder.startRecord("");
73+
encoder.literal(LITERAL1, VALUE1);
74+
encoder.literal(LITERAL2, VALUE2);
75+
encoder.literal(LITERAL3, VALUE3);
76+
encoder.endRecord();
77+
78+
verify(receiver).process(fixQuotes("{'L1':'V1','L2':'V2','L3':'V3'}"));
79+
}
80+
81+
@Test
82+
public void testShouldEncodeEntities() {
5583
encoder.startRecord("");
56-
encoder.literal("lit1", "val1");
57-
encoder.startEntity("ent1");
58-
encoder.literal("lit2", "val2");
59-
encoder.literal("lit3", "val3");
84+
encoder.startEntity(ENTITY1);
85+
encoder.literal(LITERAL1, VALUE1);
86+
encoder.literal(LITERAL2, VALUE2);
87+
encoder.endEntity();
88+
encoder.startEntity(ENTITY2);
89+
encoder.literal(LITERAL1, VALUE1);
90+
encoder.literal(LITERAL2, VALUE2);
91+
encoder.endEntity();
92+
encoder.endRecord();
93+
94+
verify(receiver).process(fixQuotes("{'En1':{'L1':'V1','L2':'V2'},'En2':{'L1':'V1','L2':'V2'}}"));
95+
}
96+
97+
@Test
98+
public void testShouldEncodeNestedEntities() {
99+
encoder.startRecord("");
100+
encoder.startEntity(ENTITY1);
101+
encoder.startEntity(ENTITY2);
102+
encoder.literal(LITERAL1, VALUE1);
103+
encoder.endEntity();
60104
encoder.endEntity();
61105
encoder.endRecord();
62106

63-
verify(receiver).process(fixQuotes("{'lit1':'val1','ent1':{'lit2':'val2','lit3':'val3'}}"));
107+
verify(receiver).process(fixQuotes("{'En1':{'En2':{'L1':'V1'}}}"));
64108
}
65109

66110
@Test
67111
public void testShouldEncodeMarkedEntitiesAsList() {
68112
encoder.startRecord("");
69-
encoder.startEntity("list[]");
70-
encoder.literal("a", "1");
71-
encoder.literal("b", "2");
72-
encoder.literal("c", "3");
113+
encoder.startEntity(LIST1);
114+
encoder.literal(LITERAL1, VALUE1);
115+
encoder.literal(LITERAL2, VALUE2);
116+
encoder.literal(LITERAL3, VALUE3);
73117
encoder.endEntity();
74118
encoder.endRecord();
75119

76-
verify(receiver).process(fixQuotes("{'list':['1','2','3']}"));
120+
verify(receiver).process(fixQuotes("{'Li1':['V1','V2','V3']}"));
121+
}
122+
123+
@Test
124+
public void testShouldEncodeEntitiesInLists() {
125+
encoder.startRecord("");
126+
encoder.startEntity(LIST1);
127+
encoder.startEntity(ENTITY1);
128+
encoder.literal(LITERAL1, VALUE1);
129+
encoder.literal(LITERAL2, VALUE2);
130+
encoder.endEntity();
131+
encoder.startEntity(ENTITY2);
132+
encoder.literal(LITERAL3, VALUE3);
133+
encoder.literal(LITERAL4, VALUE4);
134+
encoder.endEntity();
135+
encoder.endEntity();
136+
encoder.endRecord();
137+
138+
verify(receiver).process(fixQuotes("{'Li1':[{'L1':'V1','L2':'V2'},{'L3':'V3','L4':'V4'}]}"));
139+
}
140+
141+
@Test
142+
public void testShouldEncodeNestedLists() {
143+
encoder.startRecord("");
144+
encoder.startEntity(LIST1);
145+
encoder.startEntity(LIST2);
146+
encoder.literal(LITERAL1, VALUE1);
147+
encoder.literal(LITERAL2, VALUE2);
148+
encoder.endEntity();
149+
encoder.startEntity(LIST3);
150+
encoder.literal(LITERAL3, VALUE3);
151+
encoder.literal(LITERAL4, VALUE4);
152+
encoder.endEntity();
153+
encoder.endEntity();
154+
encoder.endRecord();
155+
156+
verify(receiver).process(fixQuotes("{'Li1':[['V1','V2'],['V3','V4']]}"));
77157
}
78158

79159
/*
@@ -84,4 +164,5 @@ public void testShouldEncodeMarkedEntitiesAsList() {
84164
private String fixQuotes(final String str) {
85165
return str.replace('\'', '"');
86166
}
167+
87168
}

0 commit comments

Comments
 (0)