Fix for #167
diff --git a/src/main/java/com/fasterxml/jackson/core/json/JsonWriteContext.java b/src/main/java/com/fasterxml/jackson/core/json/JsonWriteContext.java
index b383143..275b2ca 100644
--- a/src/main/java/com/fasterxml/jackson/core/json/JsonWriteContext.java
+++ b/src/main/java/com/fasterxml/jackson/core/json/JsonWriteContext.java
@@ -128,6 +128,9 @@
* @return Index of the field entry (0-based)
*/
public int writeFieldName(String name) throws JsonProcessingException {
+ if (_gotName) {
+ return JsonWriteContext.STATUS_EXPECT_VALUE;
+ }
_gotName = true;
_currentName = name;
if (_dups != null) { _checkDup(_dups, name); }
diff --git a/src/test/java/com/fasterxml/jackson/core/json/TestGeneratorDupHandling.java b/src/test/java/com/fasterxml/jackson/core/json/TestGeneratorDupHandling.java
index f7be3e3..d8d538c 100644
--- a/src/test/java/com/fasterxml/jackson/core/json/TestGeneratorDupHandling.java
+++ b/src/test/java/com/fasterxml/jackson/core/json/TestGeneratorDupHandling.java
@@ -26,7 +26,7 @@
final JsonFactory f = new JsonFactory();
_testSimpleDups(false, true, f);
}
-
+
@SuppressWarnings("resource")
protected void _testSimpleDups(boolean useStream, boolean lazySetting, JsonFactory f)
throws Exception
diff --git a/src/test/java/com/fasterxml/jackson/core/json/TestJsonGenerator.java b/src/test/java/com/fasterxml/jackson/core/json/TestJsonGenerator.java
index b804e4c..9e26e28 100644
--- a/src/test/java/com/fasterxml/jackson/core/json/TestJsonGenerator.java
+++ b/src/test/java/com/fasterxml/jackson/core/json/TestJsonGenerator.java
@@ -13,7 +13,6 @@
{
// // // First, tests for primitive (non-structured) values
- @SuppressWarnings("resource")
public void testStringWrite() throws Exception
{
JsonFactory jf = new JsonFactory();
@@ -226,7 +225,38 @@
gen.close();
}
-
+
+ // [core#167]: no error for writing field name twice
+ public void testDupFieldNameWrites() throws Exception
+ {
+ JsonFactory f = new JsonFactory();
+ _testDupFieldNameWrites(f, false);
+ _testDupFieldNameWrites(f, true);
+ }
+
+ private void _testDupFieldNameWrites(JsonFactory f, boolean useReader) throws Exception
+ {
+ JsonGenerator gen;
+ ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ if (useReader) {
+ gen = f.createGenerator(new OutputStreamWriter(bout, "UTF-8"));
+ } else {
+ gen = f.createGenerator(bout, JsonEncoding.UTF8);
+ }
+ gen.writeStartObject();
+ gen.writeFieldName("a");
+
+ try {
+ gen.writeFieldName("b");
+ gen.flush();
+ String json = bout.toString("UTF-8");
+ fail("Should not have let two consequtive field name writes succeed: output = "+json);
+ } catch (JsonProcessingException e) {
+ verifyException(e, "can not write a field name, expecting a value");
+ }
+ gen.close();
+ }
+
/*
/**********************************************************
/* Internal methods