Skip to content

Commit 08bee30

Browse files
Marcono1234tibor-universe
authored andcommitted
Fix Gson.newJsonWriter ignoring lenient and HTML-safe setting (google#1989)
* Improve Gson newJsonWriter and newJsonReader documentation * Consider lenient and HTML-safe setting for Gson.newJsonWriter * Remove empty line between imports
1 parent 9ee4f3a commit 08bee30

File tree

2 files changed

+86
-0
lines changed

2 files changed

+86
-0
lines changed

gson/src/main/java/com/google/gson/Gson.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -783,6 +783,15 @@ public void toJson(JsonElement jsonElement, Appendable writer) throws JsonIOExce
783783

784784
/**
785785
* Returns a new JSON writer configured for the settings on this Gson instance.
786+
*
787+
* <p>The following settings are considered:
788+
* <ul>
789+
* <li>{@link GsonBuilder#disableHtmlEscaping()}</li>
790+
* <li>{@link GsonBuilder#generateNonExecutableJson()}</li>
791+
* <li>{@link GsonBuilder#serializeNulls()}</li>
792+
* <li>{@link GsonBuilder#setLenient()}</li>
793+
* <li>{@link GsonBuilder#setPrettyPrinting()}</li>
794+
* </ul>
786795
*/
787796
public JsonWriter newJsonWriter(Writer writer) throws IOException {
788797
if (generateNonExecutableJson) {
@@ -792,12 +801,19 @@ public JsonWriter newJsonWriter(Writer writer) throws IOException {
792801
if (prettyPrinting) {
793802
jsonWriter.setIndent(" ");
794803
}
804+
jsonWriter.setHtmlSafe(htmlSafe);
805+
jsonWriter.setLenient(lenient);
795806
jsonWriter.setSerializeNulls(serializeNulls);
796807
return jsonWriter;
797808
}
798809

799810
/**
800811
* Returns a new JSON reader configured for the settings on this Gson instance.
812+
*
813+
* <p>The following settings are considered:
814+
* <ul>
815+
* <li>{@link GsonBuilder#setLenient()}</li>
816+
* </ul>
801817
*/
802818
public JsonReader newJsonReader(Reader reader) {
803819
JsonReader jsonReader = new JsonReader(reader);

gson/src/test/java/com/google/gson/GsonTest.java

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@
1919
import com.google.gson.internal.Excluder;
2020
import com.google.gson.stream.JsonReader;
2121
import com.google.gson.stream.JsonWriter;
22+
import com.google.gson.stream.MalformedJsonException;
2223
import java.io.IOException;
24+
import java.io.StringReader;
25+
import java.io.StringWriter;
2326
import java.lang.reflect.Field;
2427
import java.lang.reflect.Type;
2528
import java.text.DateFormat;
@@ -82,4 +85,71 @@ private static final class TestTypeAdapter extends TypeAdapter<Object> {
8285
}
8386
@Override public Object read(JsonReader in) throws IOException { return null; }
8487
}
88+
89+
public void testNewJsonWriter_Default() throws IOException {
90+
StringWriter writer = new StringWriter();
91+
JsonWriter jsonWriter = new Gson().newJsonWriter(writer);
92+
jsonWriter.beginObject();
93+
jsonWriter.name("test");
94+
jsonWriter.nullValue();
95+
jsonWriter.name("<test2");
96+
jsonWriter.value(true);
97+
jsonWriter.endObject();
98+
99+
try {
100+
// Additional top-level value
101+
jsonWriter.value(1);
102+
fail();
103+
} catch (IllegalStateException expected) {
104+
assertEquals("JSON must have only one top-level value.", expected.getMessage());
105+
}
106+
107+
jsonWriter.close();
108+
assertEquals("{\"\\u003ctest2\":true}", writer.toString());
109+
}
110+
111+
public void testNewJsonWriter_Custom() throws IOException {
112+
StringWriter writer = new StringWriter();
113+
JsonWriter jsonWriter = new GsonBuilder()
114+
.disableHtmlEscaping()
115+
.generateNonExecutableJson()
116+
.setPrettyPrinting()
117+
.serializeNulls()
118+
.setLenient()
119+
.create()
120+
.newJsonWriter(writer);
121+
jsonWriter.beginObject();
122+
jsonWriter.name("test");
123+
jsonWriter.nullValue();
124+
jsonWriter.name("<test2");
125+
jsonWriter.value(true);
126+
jsonWriter.endObject();
127+
128+
// Additional top-level value
129+
jsonWriter.value(1);
130+
131+
jsonWriter.close();
132+
assertEquals(")]}'\n{\n \"test\": null,\n \"<test2\": true\n}1", writer.toString());
133+
}
134+
135+
public void testNewJsonReader_Default() throws IOException {
136+
String json = "test"; // String without quotes
137+
JsonReader jsonReader = new Gson().newJsonReader(new StringReader(json));
138+
try {
139+
jsonReader.nextString();
140+
fail();
141+
} catch (MalformedJsonException expected) {
142+
}
143+
jsonReader.close();
144+
}
145+
146+
public void testNewJsonReader_Custom() throws IOException {
147+
String json = "test"; // String without quotes
148+
JsonReader jsonReader = new GsonBuilder()
149+
.setLenient()
150+
.create()
151+
.newJsonReader(new StringReader(json));
152+
assertEquals("test", jsonReader.nextString());
153+
jsonReader.close();
154+
}
85155
}

0 commit comments

Comments
 (0)