Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Changes to ensure if no object is opened user won't be able to write property name #2475

Merged
merged 4 commits into from
Aug 22, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions gson/src/main/java/com/google/gson/stream/JsonWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -498,6 +498,9 @@ public JsonWriter name(String name) throws IOException {
if (stackSize == 0) {
throw new IllegalStateException("JsonWriter is closed.");
}
if (stackSize == 1 && (peek() == EMPTY_DOCUMENT || peek() == NONEMPTY_DOCUMENT)) {
throw new IllegalStateException("Please begin an object before this.");
}
deferredName = name;
return this;
}
Expand Down
49 changes: 42 additions & 7 deletions gson/src/test/java/com/google/gson/stream/JsonWriterTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
import java.math.BigDecimal;
import java.math.BigInteger;
import org.junit.Test;
import java.util.Arrays;
import java.util.List;

@SuppressWarnings("resource")
public final class JsonWriterTest {
Expand Down Expand Up @@ -114,13 +116,17 @@ public void testTopLevelValueTypes() throws IOException {
public void testInvalidTopLevelTypes() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.name("hello"); // TODO: This should throw, see https://github.com/google/gson/issues/2407
try {
jsonWriter.value("world");
fail();
} catch (IllegalStateException expected) {
assertThat(expected).hasMessageThat().isEqualTo("Nesting problem.");
}
assertThrows(IllegalStateException.class, () -> jsonWriter.name("hello"));
}

@Test
public void closeAllObjectsAndTryToAddElements() throws IOException {
JsonWriter jsonWriterForNameAddition = getJsonWriterWithObjects();
assertThrows(IllegalStateException.class, () -> jsonWriterForNameAddition.name("this_throw_exception_as_all_objects_are_closed"));
jsonWriterForNameAddition.close();
JsonWriter jsonWriterForValueAddition = getJsonWriterWithObjects();
assertThrows(IllegalStateException.class, () -> jsonWriterForValueAddition.value("this_throw_exception_as_only_one_top_level_entry"));
jsonWriterForValueAddition.close();
}

@Test
Expand Down Expand Up @@ -973,4 +979,33 @@ public void testIndentOverwritesFormattingStyle() throws IOException {
+ "}";
assertThat(stringWriter.toString()).isEqualTo(expected);
}

/**
* This method wites a json object and return a jsonwriter object
* that we can use for the testing purpose
* @return JsonWriter Object with nested object and an array
*/
private JsonWriter getJsonWriterWithObjects() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginObject();
jsonWriter.name("a").value(20);
jsonWriter.name("age").value(30);

// Start the nested "address" object
jsonWriter.name("address").beginObject();
jsonWriter.name("city").value("New York");
jsonWriter.name("country").value("USA");
jsonWriter.endObject(); // End the nested "address" object
jsonWriter.name("random_prop").value(78);
// Add an array of phone numbers (list of numbers)
List<Integer> phoneNumbers = Arrays.asList(1234567890, 98989, 9909);
jsonWriter.name("phoneNumbers").beginArray();
for (Integer phoneNumber : phoneNumbers) {
jsonWriter.value(phoneNumber);
}
jsonWriter.endArray(); // End the array
jsonWriter.endObject(); // End the outer object
return jsonWriter;
}
}