Implement last part of #277 for JSON backend (still need to add to smile/cbor/protobuf)
diff --git a/release-notes/VERSION b/release-notes/VERSION
index 6492b72..652a695 100644
--- a/release-notes/VERSION
+++ b/release-notes/VERSION
@@ -27,6 +27,7 @@
#265: `JsonStringEncoder` should allow passing `CharSequence`
(contributed by Mikael S)
#276: Add support for serializing using `java.io.DataOutput`
+#277: Add new scalar-array write methods for `int`/`long`/`double` cases
#280: Add `JsonParser.finishToken()` to force full, non-lazy reading of current token
#282: Fail to report error for trying to write field name outside Object (root level)
#285: Add `JsonParser.getText(Writer)`
diff --git a/src/main/java/com/fasterxml/jackson/core/JsonGenerator.java b/src/main/java/com/fasterxml/jackson/core/JsonGenerator.java
index 920f4a7..b8d7a0f 100644
--- a/src/main/java/com/fasterxml/jackson/core/JsonGenerator.java
+++ b/src/main/java/com/fasterxml/jackson/core/JsonGenerator.java
@@ -841,6 +841,54 @@
writeEndArray();
}
+ /**
+ * Value write method that can be called to write a single
+ * array (sequence of {@link JsonToken#START_ARRAY}, zero or
+ * more {@link JsonToken#VALUE_NUMBER_INT}, {@link JsonToken#END_ARRAY})
+ *
+ * @since 2.8
+ *
+ * @param array Array that contains values to write
+ * @param offset Offset of the first element to write, within array
+ * @param length Number of elements in array to write, from `offset` to `offset + len - 1`
+ */
+ public void writeArray(long[] array, int offset, int length) throws IOException
+ {
+ if (array == null) {
+ throw new IllegalArgumentException("null array");
+ }
+ _verifyOffsets(array.length, offset, length);
+ writeStartArray();
+ for (int i = offset, end = offset+length; i < end; ++i) {
+ writeNumber(array[i]);
+ }
+ writeEndArray();
+ }
+
+ /**
+ * Value write method that can be called to write a single
+ * array (sequence of {@link JsonToken#START_ARRAY}, zero or
+ * more {@link JsonToken#VALUE_NUMBER_FLOAT}, {@link JsonToken#END_ARRAY})
+ *
+ * @since 2.8
+ *
+ * @param array Array that contains values to write
+ * @param offset Offset of the first element to write, within array
+ * @param length Number of elements in array to write, from `offset` to `offset + len - 1`
+ */
+ public void writeArray(double[] array, int offset, int length) throws IOException
+ {
+ if (array == null) {
+ throw new IllegalArgumentException("null array");
+ }
+ _verifyOffsets(array.length, offset, length);
+ writeStartArray();
+ for (int i = offset, end = offset+length; i < end; ++i) {
+ writeNumber(array[i]);
+ }
+ writeEndArray();
+ }
+
/*
/**********************************************************
/* Public API, write methods, text/String values
diff --git a/src/main/java/com/fasterxml/jackson/core/base/GeneratorBase.java b/src/main/java/com/fasterxml/jackson/core/base/GeneratorBase.java
index c3992d7..665ad42 100644
--- a/src/main/java/com/fasterxml/jackson/core/base/GeneratorBase.java
+++ b/src/main/java/com/fasterxml/jackson/core/base/GeneratorBase.java
@@ -5,8 +5,8 @@
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.json.DupDetector;
import com.fasterxml.jackson.core.json.JsonWriteContext;
+import com.fasterxml.jackson.core.json.PackageVersion;
import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
-import com.fasterxml.jackson.core.util.VersionUtil;
/**
* This base class implements part of API that a JSON generator exposes
@@ -114,7 +114,7 @@
* a simple generated class, with information extracted from Maven project file
* during build.
*/
- @Override public Version version() { return VersionUtil.versionFor(getClass()); }
+ @Override public Version version() { return PackageVersion.VERSION; }
@Override
public Object getCurrentValue() {
diff --git a/src/main/java/com/fasterxml/jackson/core/util/JsonGeneratorDelegate.java b/src/main/java/com/fasterxml/jackson/core/util/JsonGeneratorDelegate.java
index 40cd508..f9c40f4 100644
--- a/src/main/java/com/fasterxml/jackson/core/util/JsonGeneratorDelegate.java
+++ b/src/main/java/com/fasterxml/jackson/core/util/JsonGeneratorDelegate.java
@@ -208,11 +208,30 @@
public void writeEndObject() throws IOException { delegate.writeEndObject(); }
@Override
- public void writeFieldName(String name) throws IOException { delegate.writeFieldName(name); }
+ public void writeFieldName(String name) throws IOException {
+ delegate.writeFieldName(name);
+ }
@Override
- public void writeFieldName(SerializableString name) throws IOException { delegate.writeFieldName(name); }
-
+ public void writeFieldName(SerializableString name) throws IOException {
+ delegate.writeFieldName(name);
+ }
+
+ @Override
+ public void writeArray(int[] array, int offset, int length) throws IOException {
+ delegate.writeArray(array, offset, length);
+ }
+
+ @Override
+ public void writeArray(long[] array, int offset, int length) throws IOException {
+ delegate.writeArray(array, offset, length);
+ }
+
+ @Override
+ public void writeArray(double[] array, int offset, int length) throws IOException {
+ delegate.writeArray(array, offset, length);
+ }
+
/*
/**********************************************************
/* Public API, write methods, text/String values
diff --git a/src/test/java/com/fasterxml/jackson/core/json/ArrayGenerationTest.java b/src/test/java/com/fasterxml/jackson/core/json/ArrayGenerationTest.java
index d3d2353..dd490b3 100644
--- a/src/test/java/com/fasterxml/jackson/core/json/ArrayGenerationTest.java
+++ b/src/test/java/com/fasterxml/jackson/core/json/ArrayGenerationTest.java
@@ -18,6 +18,18 @@
_testIntArray(true);
}
+ public void testLongArray() throws Exception
+ {
+ _testLongArray(false);
+ _testLongArray(true);
+ }
+
+ public void testDoubleArray() throws Exception
+ {
+ _testDoubleArray(false);
+ _testDoubleArray(true);
+ }
+
private void _testIntArray(boolean useBytes) throws Exception {
// first special cases of 0, 1 values
_testIntArray(useBytes, 0, 0, 0);
@@ -37,6 +49,44 @@
_testIntArray(useBytes, 5009, 0, 1);
}
+ private void _testLongArray(boolean useBytes) throws Exception {
+ // first special cases of 0, 1 values
+ _testLongArray(useBytes, 0, 0, 0);
+ _testLongArray(useBytes, 0, 1, 1);
+
+ _testLongArray(useBytes, 1, 0, 0);
+ _testLongArray(useBytes, 1, 1, 1);
+
+ // and then some bigger data
+ _testLongArray(useBytes, 15, 0, 0);
+ _testLongArray(useBytes, 15, 2, 3);
+ _testLongArray(useBytes, 39, 0, 0);
+ _testLongArray(useBytes, 39, 4, 0);
+ _testLongArray(useBytes, 271, 0, 0);
+ _testLongArray(useBytes, 271, 0, 4);
+ _testLongArray(useBytes, 5009, 0, 0);
+ _testLongArray(useBytes, 5009, 0, 1);
+ }
+
+ private void _testDoubleArray(boolean useBytes) throws Exception {
+ // first special cases of 0, 1 values
+ _testDoubleArray(useBytes, 0, 0, 0);
+ _testDoubleArray(useBytes, 0, 1, 1);
+
+ _testDoubleArray(useBytes, 1, 0, 0);
+ _testDoubleArray(useBytes, 1, 1, 1);
+
+ // and then some bigger data
+ _testDoubleArray(useBytes, 15, 0, 0);
+ _testDoubleArray(useBytes, 15, 2, 3);
+ _testDoubleArray(useBytes, 39, 0, 0);
+ _testDoubleArray(useBytes, 39, 4, 0);
+ _testDoubleArray(useBytes, 271, 0, 0);
+ _testDoubleArray(useBytes, 271, 0, 4);
+ _testDoubleArray(useBytes, 5009, 0, 0);
+ _testDoubleArray(useBytes, 5009, 0, 1);
+ }
+
private void _testIntArray(boolean useBytes, int elements, int pre, int post) throws Exception
{
int[] values = new int[elements+pre+post];
@@ -77,4 +127,82 @@
assertToken(JsonToken.END_ARRAY, p.nextToken());
p.close();
}
+
+ private void _testLongArray(boolean useBytes, int elements, int pre, int post) throws Exception
+ {
+ long[] values = new long[elements+pre+post];
+ for (int i = pre, end = pre+elements; i < end; ++i) {
+ values[i] = i-pre;
+ }
+
+ StringWriter sw = new StringWriter();
+ ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+
+ JsonGenerator gen = useBytes ? FACTORY.createGenerator(bytes)
+ : FACTORY.createGenerator(sw);
+
+ gen.writeArray(values, pre, elements);
+ gen.close();
+
+ String json;
+ if (useBytes) {
+ json = bytes.toString("UTF-8");
+ } else {
+ json = sw.toString();
+ }
+
+ JsonParser p = useBytes ? FACTORY.createParser(bytes.toByteArray())
+ : FACTORY.createParser(json);
+ assertToken(JsonToken.START_ARRAY, p.nextToken());
+ for (int i = 0; i < elements; ++i) {
+ if ((i & 1) == 0) { // alternate
+ JsonToken t = p.nextToken();
+ if (t != JsonToken.VALUE_NUMBER_INT) {
+ fail("Expected number, got "+t+", element #"+i);
+ }
+ assertEquals(i, p.getLongValue());
+ } else {
+ assertEquals(i, p.nextLongValue(-1));
+ }
+ }
+ assertToken(JsonToken.END_ARRAY, p.nextToken());
+ p.close();
+ }
+
+ private void _testDoubleArray(boolean useBytes, int elements, int pre, int post) throws Exception
+ {
+ double[] values = new double[elements+pre+post];
+ for (int i = pre, end = pre+elements; i < end; ++i) {
+ values[i] = i-pre;
+ }
+
+ StringWriter sw = new StringWriter();
+ ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+
+ JsonGenerator gen = useBytes ? FACTORY.createGenerator(bytes)
+ : FACTORY.createGenerator(sw);
+
+ gen.writeArray(values, pre, elements);
+ gen.close();
+
+ String json;
+ if (useBytes) {
+ json = bytes.toString("UTF-8");
+ } else {
+ json = sw.toString();
+ }
+
+ JsonParser p = useBytes ? FACTORY.createParser(bytes.toByteArray())
+ : FACTORY.createParser(json);
+ assertToken(JsonToken.START_ARRAY, p.nextToken());
+ for (int i = 0; i < elements; ++i) {
+ JsonToken t = p.nextToken();
+ if (t != JsonToken.VALUE_NUMBER_FLOAT) {
+ fail("Expected floating-point number, got "+t+", element #"+i);
+ }
+ assertEquals((double) i, p.getDoubleValue());
+ }
+ assertToken(JsonToken.END_ARRAY, p.nextToken());
+ p.close();
+ }
}
diff --git a/src/test/java/com/fasterxml/jackson/core/json/GeneratorFeaturesTest.java b/src/test/java/com/fasterxml/jackson/core/json/GeneratorFeaturesTest.java
new file mode 100644
index 0000000..94cbcd9
--- /dev/null
+++ b/src/test/java/com/fasterxml/jackson/core/json/GeneratorFeaturesTest.java
@@ -0,0 +1,261 @@
+package com.fasterxml.jackson.core.json;
+
+import java.io.*;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+
+import com.fasterxml.jackson.core.*;
+
+/**
+ * Set of basic unit tests for verifying that the basic generator
+ * functionality works as expected.
+ */
+public class GeneratorFeaturesTest
+ extends com.fasterxml.jackson.core.BaseTest
+{
+ private final JsonFactory JSON_F = new JsonFactory();
+
+ public void testConfigDefaults() throws IOException
+ {
+ JsonGenerator g = JSON_F.createGenerator(new StringWriter());
+ assertFalse(g.isEnabled(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS));
+ assertFalse(g.isEnabled(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN));
+ g.close();
+ }
+
+ @SuppressWarnings("deprecation")
+ public void testConfigOverrides() throws IOException
+ {
+ // but also allow overide
+ JsonGenerator g = JSON_F.createGenerator(new StringWriter());
+ int mask = JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS.getMask()
+ | JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN.getMask();
+ g.overrideStdFeatures(mask, mask);
+ assertTrue(g.isEnabled(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS));
+ assertTrue(g.isEnabled(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN));
+
+ // and for now, also test straight override
+ g.setFeatureMask(0);
+ assertFalse(g.isEnabled(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS));
+ assertFalse(g.isEnabled(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN));
+ g.close();
+ }
+
+ public void testFieldNameQuoting() throws IOException
+ {
+ JsonFactory f = new JsonFactory();
+ // by default, quoting should be enabled
+ _testFieldNameQuoting(f, true);
+ // can disable it
+ f.disable(JsonGenerator.Feature.QUOTE_FIELD_NAMES);
+ _testFieldNameQuoting(f, false);
+ // and (re)enable:
+ f.enable(JsonGenerator.Feature.QUOTE_FIELD_NAMES);
+ _testFieldNameQuoting(f, true);
+ }
+
+ public void testNonNumericQuoting() throws IOException
+ {
+ JsonFactory f = new JsonFactory();
+ // by default, quoting should be enabled
+ _testNonNumericQuoting(f, true);
+ // can disable it
+ f.disable(JsonGenerator.Feature.QUOTE_NON_NUMERIC_NUMBERS);
+ _testNonNumericQuoting(f, false);
+ // and (re)enable:
+ f.enable(JsonGenerator.Feature.QUOTE_NON_NUMERIC_NUMBERS);
+ _testNonNumericQuoting(f, true);
+ }
+
+ /**
+ * Testing for [JACKSON-176], ability to force serializing numbers
+ * as JSON Strings.
+ */
+ public void testNumbersAsJSONStrings() throws IOException
+ {
+ JsonFactory f = new JsonFactory();
+ // by default should output numbers as-is:
+ assertEquals("[1,2,1.25,2.25,3001,0.5,-1]", _writeNumbers(f));
+
+ // but if overridden, quotes as Strings
+ f.configure(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS, true);
+ assertEquals("[\"1\",\"2\",\"1.25\",\"2.25\",\"3001\",\"0.5\",\"-1\"]",
+ _writeNumbers(f));
+
+
+ }
+
+ public void testBigDecimalAsPlain() throws IOException
+ {
+ JsonFactory f = new JsonFactory();
+ BigDecimal ENG = new BigDecimal("1E+2");
+
+ StringWriter sw = new StringWriter();
+ JsonGenerator g = f.createGenerator(sw);
+ g.writeNumber(ENG);
+ g.close();
+ assertEquals("1E+2", sw.toString());
+
+ f.configure(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN, true);
+ sw = new StringWriter();
+ g = f.createGenerator(sw);
+ g.writeNumber(ENG);
+ g.close();
+ assertEquals("100", sw.toString());
+ }
+
+ public void testBigDecimalAsPlainString() throws Exception
+ {
+ JsonFactory f = new JsonFactory();
+ BigDecimal ENG = new BigDecimal("1E+2");
+ f.enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN);
+ f.enable(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS);
+
+ StringWriter sw = new StringWriter();
+ JsonGenerator g = f.createGenerator(sw);
+ g.writeNumber(ENG);
+ g.close();
+ assertEquals(quote("100"), sw.toString());
+
+ // also, as bytes
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ g = f.createGenerator(bos);
+ g.writeNumber(ENG);
+ g.close();
+ assertEquals(quote("100"), bos.toString("UTF-8"));
+ }
+
+ private String _writeNumbers(JsonFactory f) throws IOException
+ {
+ StringWriter sw = new StringWriter();
+ JsonGenerator g = f.createGenerator(sw);
+
+ g.writeStartArray();
+ g.writeNumber(1);
+ g.writeNumber(2L);
+ g.writeNumber(1.25);
+ g.writeNumber(2.25f);
+ g.writeNumber(BigInteger.valueOf(3001));
+ g.writeNumber(BigDecimal.valueOf(0.5));
+ g.writeNumber("-1");
+ g.writeEndArray();
+ g.close();
+
+ return sw.toString();
+ }
+
+ // for [core#246]
+ public void testFieldNameQuotingEnabled() throws IOException
+ {
+ // // First, test with default factory, with quoting enabled by default
+
+ // First, default, with quotes
+ _testFieldNameQuotingEnabled(JSON_F, true, true, "{\"foo\":1}");
+ _testFieldNameQuotingEnabled(JSON_F, false, true, "{\"foo\":1}");
+
+ // then without quotes
+ _testFieldNameQuotingEnabled(JSON_F, true, false, "{foo:1}");
+ _testFieldNameQuotingEnabled(JSON_F, false, false, "{foo:1}");
+
+ // // Then with alternatively configured factory
+
+ JsonFactory f2 = new JsonFactory();
+ f2.disable(JsonGenerator.Feature.QUOTE_FIELD_NAMES);
+
+ _testFieldNameQuotingEnabled(f2, true, true, "{\"foo\":1}");
+ _testFieldNameQuotingEnabled(f2, false, true, "{\"foo\":1}");
+
+ // then without quotes
+ _testFieldNameQuotingEnabled(f2, true, false, "{foo:1}");
+ _testFieldNameQuotingEnabled(f2, false, false, "{foo:1}");
+ }
+
+ private void _testFieldNameQuotingEnabled(JsonFactory f, boolean useBytes,
+ boolean useQuotes, String exp) throws IOException
+ {
+ ByteArrayOutputStream bytes = useBytes ? new ByteArrayOutputStream() : null;
+ StringWriter sw = useBytes ? null : new StringWriter();
+ JsonGenerator gen = useBytes ? f.createGenerator(bytes) : f.createGenerator(sw);
+ if (useQuotes) {
+ gen.enable(JsonGenerator.Feature.QUOTE_FIELD_NAMES);
+ } else {
+ gen.disable(JsonGenerator.Feature.QUOTE_FIELD_NAMES);
+ }
+
+ gen.writeStartObject();
+ gen.writeFieldName("foo");
+ gen.writeNumber(1);
+ gen.writeEndObject();
+ gen.close();
+
+ String json = useBytes ? bytes.toString("UTF-8") : sw.toString();
+ assertEquals(exp, json);
+ }
+
+ public void testChangeOnGenerator() throws IOException
+ {
+ StringWriter w = new StringWriter();
+
+ JsonGenerator g = JSON_F.createGenerator(w);
+ g.enable(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS);
+ g.writeNumber(123);
+ g.close();
+ assertEquals(quote("123"), w.toString());
+
+ // but also the opposite
+ w = new StringWriter();
+ g = JSON_F.createGenerator(w);
+ g.enable(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS);
+ g.disable(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS);
+ g.writeNumber(123);
+ g.close();
+ assertEquals("123", w.toString());
+ }
+
+ /*
+ /**********************************************************
+ /* Helper methods
+ /**********************************************************
+ */
+
+ private void _testFieldNameQuoting(JsonFactory f, boolean quoted)
+ throws IOException
+ {
+ StringWriter sw = new StringWriter();
+ JsonGenerator g = f.createGenerator(sw);
+ g.writeStartObject();
+ g.writeFieldName("foo");
+ g.writeNumber(1);
+ g.writeEndObject();
+ g.close();
+
+ String result = sw.toString();
+ if (quoted) {
+ assertEquals("{\"foo\":1}", result);
+ } else {
+ assertEquals("{foo:1}", result);
+ }
+ }
+ private void _testNonNumericQuoting(JsonFactory f, boolean quoted)
+ throws IOException
+ {
+ StringWriter sw = new StringWriter();
+ JsonGenerator g = f.createGenerator(sw);
+ g.writeStartObject();
+ g.writeFieldName("double");
+ g.writeNumber(Double.NaN);
+ g.writeEndObject();
+ g.writeStartObject();
+ g.writeFieldName("float");
+ g.writeNumber(Float.NaN);
+ g.writeEndObject();
+ g.close();
+
+ String result = sw.toString();
+ if (quoted) {
+ assertEquals("{\"double\":\"NaN\"} {\"float\":\"NaN\"}", result);
+ } else {
+ assertEquals("{\"double\":NaN} {\"float\":NaN}", result);
+ }
+ }
+}
diff --git a/src/test/java/com/fasterxml/jackson/core/json/TestJsonGeneratorFeatures.java b/src/test/java/com/fasterxml/jackson/core/json/TestJsonGeneratorFeatures.java
deleted file mode 100644
index 671b351..0000000
--- a/src/test/java/com/fasterxml/jackson/core/json/TestJsonGeneratorFeatures.java
+++ /dev/null
@@ -1,221 +0,0 @@
-package com.fasterxml.jackson.core.json;
-
-import java.io.*;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import com.fasterxml.jackson.core.*;
-
-/**
- * Set of basic unit tests for verifying that the basic generator
- * functionality works as expected.
- */
-public class TestJsonGeneratorFeatures
- extends com.fasterxml.jackson.core.BaseTest
-{
- private final JsonFactory JSON_F = new JsonFactory();
-
- public void testConfigDefaults() throws IOException
- {
- JsonGenerator g = JSON_F.createGenerator(new StringWriter());
- assertFalse(g.isEnabled(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS));
- assertFalse(g.isEnabled(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN));
- g.close();
- }
-
- public void testFieldNameQuoting() throws IOException
- {
- JsonFactory jf = new JsonFactory();
- // by default, quoting should be enabled
- _testFieldNameQuoting(jf, true);
- // can disable it
- jf.disable(JsonGenerator.Feature.QUOTE_FIELD_NAMES);
- _testFieldNameQuoting(jf, false);
- // and (re)enable:
- jf.enable(JsonGenerator.Feature.QUOTE_FIELD_NAMES);
- _testFieldNameQuoting(jf, true);
- }
-
- public void testNonNumericQuoting() throws IOException
- {
- JsonFactory jf = new JsonFactory();
- // by default, quoting should be enabled
- _testNonNumericQuoting(jf, true);
- // can disable it
- jf.disable(JsonGenerator.Feature.QUOTE_NON_NUMERIC_NUMBERS);
- _testNonNumericQuoting(jf, false);
- // and (re)enable:
- jf.enable(JsonGenerator.Feature.QUOTE_NON_NUMERIC_NUMBERS);
- _testNonNumericQuoting(jf, true);
- }
-
- /**
- * Testing for [JACKSON-176], ability to force serializing numbers
- * as JSON Strings.
- */
- public void testNumbersAsJSONStrings() throws IOException
- {
- JsonFactory jf = new JsonFactory();
- // by default should output numbers as-is:
- assertEquals("[1,2,1.25,2.25,3001,0.5,-1]", _writeNumbers(jf));
-
- // but if overridden, quotes as Strings
- jf.configure(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS, true);
- assertEquals("[\"1\",\"2\",\"1.25\",\"2.25\",\"3001\",\"0.5\",\"-1\"]",
- _writeNumbers(jf));
- }
-
- public void testBigDecimalAsPlain() throws IOException
- {
- JsonFactory jf = new JsonFactory();
- BigDecimal ENG = new BigDecimal("1E+2");
-
- StringWriter sw = new StringWriter();
- JsonGenerator g = jf.createGenerator(sw);
- g.writeNumber(ENG);
- g.close();
- assertEquals("1E+2", sw.toString());
-
- jf.configure(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN, true);
- sw = new StringWriter();
- g = jf.createGenerator(sw);
- g.writeNumber(ENG);
- g.close();
- assertEquals("100", sw.toString());
- }
-
- public void testBigDecimalAsPlainString() throws Exception
- {
- JsonFactory jf = new JsonFactory();
- BigDecimal ENG = new BigDecimal("1E+2");
- jf.enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN);
- jf.enable(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS);
-
- StringWriter sw = new StringWriter();
- JsonGenerator g = jf.createGenerator(sw);
- g.writeNumber(ENG);
- g.close();
- assertEquals(quote("100"), sw.toString());
-
- // also, as bytes
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- g = jf.createGenerator(bos);
- g.writeNumber(ENG);
- g.close();
- assertEquals(quote("100"), bos.toString("UTF-8"));
- }
-
- private String _writeNumbers(JsonFactory jf) throws IOException
- {
- StringWriter sw = new StringWriter();
- JsonGenerator g = jf.createGenerator(sw);
-
- g.writeStartArray();
- g.writeNumber(1);
- g.writeNumber(2L);
- g.writeNumber(1.25);
- g.writeNumber(2.25f);
- g.writeNumber(BigInteger.valueOf(3001));
- g.writeNumber(BigDecimal.valueOf(0.5));
- g.writeNumber("-1");
- g.writeEndArray();
- g.close();
-
- return sw.toString();
- }
-
- // for [core#246]
- public void testFieldNameQuotingEnabled() throws IOException
- {
- // // First, test with default factory, with quoting enabled by default
-
- // First, default, with quotes
- _testFieldNameQuotingEnabled(JSON_F, true, true, "{\"foo\":1}");
- _testFieldNameQuotingEnabled(JSON_F, false, true, "{\"foo\":1}");
-
- // then without quotes
- _testFieldNameQuotingEnabled(JSON_F, true, false, "{foo:1}");
- _testFieldNameQuotingEnabled(JSON_F, false, false, "{foo:1}");
-
- // // Then with alternatively configured factory
-
- JsonFactory JF2 = new JsonFactory();
- JF2.disable(JsonGenerator.Feature.QUOTE_FIELD_NAMES);
-
- _testFieldNameQuotingEnabled(JF2, true, true, "{\"foo\":1}");
- _testFieldNameQuotingEnabled(JF2, false, true, "{\"foo\":1}");
-
- // then without quotes
- _testFieldNameQuotingEnabled(JF2, true, false, "{foo:1}");
- _testFieldNameQuotingEnabled(JF2, false, false, "{foo:1}");
- }
-
- private void _testFieldNameQuotingEnabled(JsonFactory jf, boolean useBytes,
- boolean useQuotes, String exp) throws IOException
- {
- ByteArrayOutputStream bytes = useBytes ? new ByteArrayOutputStream() : null;
- StringWriter sw = useBytes ? null : new StringWriter();
- JsonGenerator gen = useBytes ? jf.createGenerator(bytes) : jf.createGenerator(sw);
- if (useQuotes) {
- gen.enable(JsonGenerator.Feature.QUOTE_FIELD_NAMES);
- } else {
- gen.disable(JsonGenerator.Feature.QUOTE_FIELD_NAMES);
- }
-
- gen.writeStartObject();
- gen.writeFieldName("foo");
- gen.writeNumber(1);
- gen.writeEndObject();
- gen.close();
-
- String json = useBytes ? bytes.toString("UTF-8") : sw.toString();
- assertEquals(exp, json);
- }
-
- /*
- /**********************************************************
- /* Helper methods
- /**********************************************************
- */
-
- private void _testFieldNameQuoting(JsonFactory jf, boolean quoted)
- throws IOException
- {
- StringWriter sw = new StringWriter();
- JsonGenerator g = jf.createGenerator(sw);
- g.writeStartObject();
- g.writeFieldName("foo");
- g.writeNumber(1);
- g.writeEndObject();
- g.close();
-
- String result = sw.toString();
- if (quoted) {
- assertEquals("{\"foo\":1}", result);
- } else {
- assertEquals("{foo:1}", result);
- }
- }
- private void _testNonNumericQuoting(JsonFactory jf, boolean quoted)
- throws IOException
- {
- StringWriter sw = new StringWriter();
- JsonGenerator g = jf.createGenerator(sw);
- g.writeStartObject();
- g.writeFieldName("double");
- g.writeNumber(Double.NaN);
- g.writeEndObject();
- g.writeStartObject();
- g.writeFieldName("float");
- g.writeNumber(Float.NaN);
- g.writeEndObject();
- g.close();
-
- String result = sw.toString();
- if (quoted) {
- assertEquals("{\"double\":\"NaN\"} {\"float\":\"NaN\"}", result);
- } else {
- assertEquals("{\"double\":NaN} {\"float\":NaN}", result);
- }
- }
-}