Skip to content

Commit c98ad85

Browse files
committed
Start work with #480; need bit more testing
1 parent bf8109c commit c98ad85

File tree

2 files changed

+141
-58
lines changed

2 files changed

+141
-58
lines changed

src/main/java/com/fasterxml/jackson/core/json/WriterBasedJsonGenerator.java

+15-3
Original file line numberDiff line numberDiff line change
@@ -446,10 +446,23 @@ public void writeString(SerializableString sstr) throws IOException
446446
_flushBuffer();
447447
}
448448
_outputBuffer[_outputTail++] = _quoteChar;
449+
int len = sstr.appendQuoted(_outputBuffer, _outputTail);
450+
if (len < 0) {
451+
_writeString2(sstr);
452+
return;
453+
}
454+
_outputTail += len;
455+
if (_outputTail >= _outputEnd) {
456+
_flushBuffer();
457+
}
458+
_outputBuffer[_outputTail++] = _quoteChar;
459+
}
460+
461+
private void _writeString2(SerializableString sstr) throws IOException
462+
{
449463
// Note: copied from writeRaw:
450464
char[] text = sstr.asQuotedChars();
451465
final int len = text.length;
452-
// Only worth buffering if it's a short write?
453466
if (len < SHORT_WRITE) {
454467
int room = _outputEnd - _outputTail;
455468
if (len > room) {
@@ -458,7 +471,6 @@ public void writeString(SerializableString sstr) throws IOException
458471
System.arraycopy(text, 0, _outputBuffer, _outputTail, len);
459472
_outputTail += len;
460473
} else {
461-
// Otherwise, better just pass through:
462474
_flushBuffer();
463475
_writer.write(text, 0, len);
464476
}
@@ -467,7 +479,7 @@ public void writeString(SerializableString sstr) throws IOException
467479
}
468480
_outputBuffer[_outputTail++] = _quoteChar;
469481
}
470-
482+
471483
@Override
472484
public void writeRawUTF8String(byte[] text, int offset, int length) throws IOException {
473485
// could add support for buffering if we really want it...

src/test/java/com/fasterxml/jackson/core/json/TestGeneratorWithSerializedString.java

+126-55
Original file line numberDiff line numberDiff line change
@@ -11,85 +11,156 @@ public class TestGeneratorWithSerializedString
1111
final static String NAME_WITH_QUOTES = "\"name\"";
1212
final static String NAME_WITH_LATIN1 = "P\u00f6ll\u00f6";
1313

14+
final static String VALUE_WITH_QUOTES = "\"Value\"";
15+
final static String VALUE2 = "Slightly longer value";
16+
17+
private final JsonFactory JSON_F = new JsonFactory();
18+
1419
private final SerializedString quotedName = new SerializedString(NAME_WITH_QUOTES);
1520
private final SerializedString latin1Name = new SerializedString(NAME_WITH_LATIN1);
1621

17-
public void testSimple() throws Exception
22+
public void testSimpleFieldNames() throws Exception
1823
{
19-
JsonFactory jf = new JsonFactory();
20-
2124
// First using char-backed generator
2225
StringWriter sw = new StringWriter();
23-
JsonGenerator jgen = jf.createGenerator(sw);
24-
_writeSimple(jgen);
25-
jgen.close();
26+
JsonGenerator gen = JSON_F.createGenerator(sw);
27+
_writeSimple(gen);
28+
gen.close();
2629
String json = sw.toString();
27-
_verifySimple(jf.createParser(json));
30+
_verifySimple(JSON_F.createParser(json));
2831

2932
// then using UTF-8
3033
ByteArrayOutputStream out = new ByteArrayOutputStream();
31-
jgen = jf.createGenerator(out, JsonEncoding.UTF8);
32-
_writeSimple(jgen);
33-
jgen.close();
34+
gen = JSON_F.createGenerator(out, JsonEncoding.UTF8);
35+
_writeSimple(gen);
36+
gen.close();
3437
byte[] jsonB = out.toByteArray();
35-
_verifySimple(jf.createParser(jsonB));
38+
_verifySimple(JSON_F.createParser(jsonB));
39+
}
40+
41+
public void testSimpleValues() throws Exception
42+
{
43+
// First using char-backed generator
44+
StringWriter sw = new StringWriter();
45+
JsonGenerator gen = JSON_F.createGenerator(sw);
46+
_writeSimpleValues(gen);
47+
gen.close();
48+
_verifySimpleValues(JSON_F.createParser(new StringReader(sw.toString())));
49+
50+
// then using UTF-8
51+
ByteArrayOutputStream out = new ByteArrayOutputStream();
52+
gen = JSON_F.createGenerator(out, JsonEncoding.UTF8);
53+
_writeSimpleValues(gen);
54+
gen.close();
55+
_verifySimpleValues(JSON_F.createParser(new ByteArrayInputStream(out.toByteArray())));
3656
}
3757

3858
/*
3959
/**********************************************************
4060
/* Helper methods
4161
/**********************************************************
4262
*/
43-
44-
private void _writeSimple(JsonGenerator jgen) throws Exception
63+
64+
private void _writeSimple(JsonGenerator gen) throws Exception
4565
{
4666
// Let's just write array of 2 objects
47-
jgen.writeStartArray();
48-
49-
jgen.writeStartObject();
50-
jgen.writeFieldName(quotedName);
51-
jgen.writeString("a");
52-
jgen.writeFieldName(latin1Name);
53-
jgen.writeString("b");
54-
jgen.writeEndObject();
55-
56-
jgen.writeStartObject();
57-
jgen.writeFieldName(latin1Name);
58-
jgen.writeString("c");
59-
jgen.writeFieldName(quotedName);
60-
jgen.writeString("d");
61-
jgen.writeEndObject();
67+
gen.writeStartArray();
68+
69+
gen.writeStartObject();
70+
gen.writeFieldName(quotedName);
71+
gen.writeString("a");
72+
gen.writeFieldName(latin1Name);
73+
gen.writeString("b");
74+
gen.writeEndObject();
75+
76+
gen.writeStartObject();
77+
gen.writeFieldName(latin1Name);
78+
gen.writeString("c");
79+
gen.writeFieldName(quotedName);
80+
gen.writeString("d");
81+
gen.writeEndObject();
82+
83+
gen.writeEndArray();
84+
}
85+
86+
private void _writeSimpleValues(JsonGenerator gen) throws Exception
87+
{
88+
// Let's just write an array of 2 objects
89+
gen.writeStartArray();
90+
gen.writeStartObject();
91+
gen.writeFieldName(NAME_WITH_QUOTES);
92+
gen.writeString(new SerializedString(VALUE_WITH_QUOTES));
93+
gen.writeFieldName(NAME_WITH_LATIN1);
94+
gen.writeString(VALUE2);
95+
gen.writeEndObject();
96+
97+
gen.writeStartObject();
98+
gen.writeFieldName(NAME_WITH_LATIN1);
99+
gen.writeString(VALUE_WITH_QUOTES);
100+
gen.writeFieldName(NAME_WITH_QUOTES);
101+
gen.writeString(new SerializedString(VALUE2));
102+
gen.writeEndObject();
103+
104+
gen.writeEndArray();
105+
}
106+
107+
private void _verifySimple(JsonParser p) throws Exception
108+
{
109+
assertToken(JsonToken.START_ARRAY, p.nextToken());
110+
111+
assertToken(JsonToken.START_OBJECT, p.nextToken());
112+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
113+
assertEquals(NAME_WITH_QUOTES, p.getText());
114+
assertToken(JsonToken.VALUE_STRING, p.nextToken());
115+
assertEquals("a", p.getText());
116+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
117+
assertEquals(NAME_WITH_LATIN1, p.getText());
118+
assertToken(JsonToken.VALUE_STRING, p.nextToken());
119+
assertEquals("b", p.getText());
120+
assertToken(JsonToken.END_OBJECT, p.nextToken());
121+
122+
assertToken(JsonToken.START_OBJECT, p.nextToken());
123+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
124+
assertEquals(NAME_WITH_LATIN1, p.getText());
125+
assertToken(JsonToken.VALUE_STRING, p.nextToken());
126+
assertEquals("c", p.getText());
127+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
128+
assertEquals(NAME_WITH_QUOTES, p.getText());
129+
assertToken(JsonToken.VALUE_STRING, p.nextToken());
130+
assertEquals("d", p.getText());
131+
assertToken(JsonToken.END_OBJECT, p.nextToken());
62132

63-
jgen.writeEndArray();
133+
assertToken(JsonToken.END_ARRAY, p.nextToken());
134+
assertNull(p.nextToken());
64135
}
65136

66-
private void _verifySimple(JsonParser jp) throws Exception
137+
private void _verifySimpleValues(JsonParser p) throws Exception
67138
{
68-
assertToken(JsonToken.START_ARRAY, jp.nextToken());
69-
70-
assertToken(JsonToken.START_OBJECT, jp.nextToken());
71-
assertToken(JsonToken.FIELD_NAME, jp.nextToken());
72-
assertEquals(NAME_WITH_QUOTES, jp.getText());
73-
assertToken(JsonToken.VALUE_STRING, jp.nextToken());
74-
assertEquals("a", jp.getText());
75-
assertToken(JsonToken.FIELD_NAME, jp.nextToken());
76-
assertEquals(NAME_WITH_LATIN1, jp.getText());
77-
assertToken(JsonToken.VALUE_STRING, jp.nextToken());
78-
assertEquals("b", jp.getText());
79-
assertToken(JsonToken.END_OBJECT, jp.nextToken());
80-
81-
assertToken(JsonToken.START_OBJECT, jp.nextToken());
82-
assertToken(JsonToken.FIELD_NAME, jp.nextToken());
83-
assertEquals(NAME_WITH_LATIN1, jp.getText());
84-
assertToken(JsonToken.VALUE_STRING, jp.nextToken());
85-
assertEquals("c", jp.getText());
86-
assertToken(JsonToken.FIELD_NAME, jp.nextToken());
87-
assertEquals(NAME_WITH_QUOTES, jp.getText());
88-
assertToken(JsonToken.VALUE_STRING, jp.nextToken());
89-
assertEquals("d", jp.getText());
90-
assertToken(JsonToken.END_OBJECT, jp.nextToken());
139+
assertToken(JsonToken.START_ARRAY, p.nextToken());
140+
141+
assertToken(JsonToken.START_OBJECT, p.nextToken());
142+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
143+
assertEquals(NAME_WITH_QUOTES, p.getText());
144+
assertToken(JsonToken.VALUE_STRING, p.nextToken());
145+
assertEquals(VALUE_WITH_QUOTES, p.getText());
146+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
147+
assertEquals(NAME_WITH_LATIN1, p.getText());
148+
assertToken(JsonToken.VALUE_STRING, p.nextToken());
149+
assertEquals(VALUE2, p.getText());
150+
assertToken(JsonToken.END_OBJECT, p.nextToken());
151+
152+
assertToken(JsonToken.START_OBJECT, p.nextToken());
153+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
154+
assertEquals(NAME_WITH_LATIN1, p.getText());
155+
assertToken(JsonToken.VALUE_STRING, p.nextToken());
156+
assertEquals(VALUE_WITH_QUOTES, p.getText());
157+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
158+
assertEquals(NAME_WITH_QUOTES, p.getText());
159+
assertToken(JsonToken.VALUE_STRING, p.nextToken());
160+
assertEquals(VALUE2, p.getText());
161+
assertToken(JsonToken.END_OBJECT, p.nextToken());
91162

92-
assertToken(JsonToken.END_ARRAY, jp.nextToken());
93-
assertNull(jp.nextToken());
163+
assertToken(JsonToken.END_ARRAY, p.nextToken());
164+
assertNull(p.nextToken());
94165
}
95166
}

0 commit comments

Comments
 (0)