Skip to content

Commit 6f9a791

Browse files
committed
[Java] Escape JSON strings in JsonTokenListener.
1 parent 40751e9 commit 6f9a791

File tree

4 files changed

+32
-12
lines changed

4 files changed

+32
-12
lines changed

sbe-tool/src/main/java/uk/co/real_logic/sbe/json/JsonTokenListener.java

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,9 @@ public void onVarData(
184184

185185
final byte[] tempBuffer = new byte[length];
186186
buffer.getBytes(bufferIndex, tempBuffer, 0, length);
187-
output.append(new String(tempBuffer, 0, length, typeToken.encoding().characterEncoding()));
187+
final String str = new String(tempBuffer, 0, length, typeToken.encoding().characterEncoding());
188+
189+
escape(str);
188190

189191
doubleQuote();
190192
next();
@@ -223,13 +225,12 @@ private void appendEncodingAsString(
223225
if (encoding.primitiveType() == CHAR)
224226
{
225227
doubleQuote();
228+
output.append(constOrNotPresentValue.toString());
229+
doubleQuote();
226230
}
227-
228-
output.append(constOrNotPresentValue.toString());
229-
230-
if (encoding.primitiveType() == CHAR)
231+
else
231232
{
232-
doubleQuote();
233+
output.append(constOrNotPresentValue.toString());
233234
}
234235

235236
return;
@@ -244,7 +245,7 @@ private void appendEncodingAsString(
244245

245246
for (int i = 0; i < size; i++)
246247
{
247-
output.append((char)buffer.getByte(index + (i * elementSize)));
248+
escape((char)buffer.getByte(index + (i * elementSize)));
248249
}
249250

250251
doubleQuote();
@@ -348,4 +349,22 @@ private static long readEncodingAsLong(
348349

349350
return Types.getLong(buffer, bufferIndex, typeToken.encoding());
350351
}
352+
353+
private void escape(final String str)
354+
{
355+
for (int i = 0, length = str.length(); i < length; i++)
356+
{
357+
escape(str.charAt(i));
358+
}
359+
}
360+
361+
private void escape(final char c)
362+
{
363+
if ('"' == c || '\\' == c || '\b' == c || '\f' == c || '\n' == c || '\r' == c || '\t' == c)
364+
{
365+
output.append('\\');
366+
}
367+
368+
output.append(c);
369+
}
351370
}

sbe-tool/src/test/java/uk/co/real_logic/sbe/EncodedCarTestBase.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public static void setupExampleData()
3737
{
3838
try
3939
{
40-
vehicleCode = "abcdef".getBytes(CarEncoder.vehicleCodeCharacterEncoding());
40+
vehicleCode = "ab\"def".getBytes(CarEncoder.vehicleCodeCharacterEncoding());
4141
manufacturerCode = "123".getBytes(EngineEncoder.manufacturerCodeCharacterEncoding());
4242
manufacturer = "Honda".getBytes(CarEncoder.manufacturerCharacterEncoding());
4343
model = "Civic VTi".getBytes(CarEncoder.modelCharacterEncoding());
@@ -108,6 +108,7 @@ protected static void encodeTestMessage(final ByteBuffer buffer)
108108

109109
CAR.manufacturer(new String(manufacturer));
110110
CAR.putModel(model, srcOffset, model.length);
111+
CAR.activationCode("315\\8");
111112

112113
bufferOffset += CAR.encodedLength();
113114

sbe-tool/src/test/java/uk/co/real_logic/sbe/generation/java/ToStringTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public void exampleMessagePrinted()
3939
"(sbeTemplateId=1|sbeSchemaId=1|sbeSchemaVersion=0|sbeBlockLength=45):" +
4040
"serialNumber=1234|modelYear=2013|available=T|code=A|" +
4141
"someNumbers=[0,1,2,3,4]|" +
42-
"vehicleCode=abcdef|" +
42+
"vehicleCode=ab\"def|" +
4343
"extras={sportsPack,cruiseControl}|" +
4444
"engine=(capacity=2000|numCylinders=4|manufacturerCode=123|)|" +
4545
"fuelFigures=[" +
@@ -49,7 +49,7 @@ public void exampleMessagePrinted()
4949
"performanceFigures=[" +
5050
"(octaneRating=95|acceleration=[(mph=30|seconds=4.0),(mph=60|seconds=7.5),(mph=100|seconds=12.2)])," +
5151
"(octaneRating=99|acceleration=[(mph=30|seconds=3.8),(mph=60|seconds=7.1),(mph=100|seconds=11.8)])]|" +
52-
"manufacturer='Honda'|model='Civic VTi'|activationCode=''",
52+
"manufacturer='Honda'|model='Civic VTi'|activationCode='315\\8'",
5353
result);
5454
}
5555

sbe-tool/src/test/java/uk/co/real_logic/sbe/json/JsonPrinterTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public void exampleMessagePrintedAsJson() throws Exception
6060
" \"available\": \"T\",\n" +
6161
" \"code\": \"A\",\n" +
6262
" \"someNumbers\": [0, 1, 2, 3, 4],\n" +
63-
" \"vehicleCode\": \"abcdef\",\n" +
63+
" \"vehicleCode\": \"ab\\\"def\",\n" +
6464
" \"extras\": { \"sunRoof\": false, \"sportsPack\": true, \"cruiseControl\": true },\n" +
6565
" \"engine\": \n" +
6666
" {\n" +
@@ -118,7 +118,7 @@ public void exampleMessagePrintedAsJson() throws Exception
118118
" }],\n" +
119119
" \"manufacturer\": \"Honda\",\n" +
120120
" \"model\": \"Civic VTi\",\n" +
121-
" \"activationCode\": \"\"\n" +
121+
" \"activationCode\": \"315\\\\8\"\n" +
122122
"}",
123123
result);
124124
}

0 commit comments

Comments
 (0)