Skip to content

Commits on Source 12

jackson-core (2.9.9-1) unstable; urgency=medium
[ Mechtilde ]
* debian/salsa-ci.yml was added when the repo was cloned
* New upstream version 2.9.9
* Use compat level 12
* Add in Copyright entry for debian/*
* Declare compliance with Debian Policy 4.4.0
+ Add Uploader
+ Change Version of debhelper
* Removed debian/compat and changed debian/control
+ Use debhelper-compat for choosing compat level
* Removed debian/compat and changed debian/control
+ Use debhelper-compat for choosing compat level
-- Mechtilde Stehmann <mechtilde@debian.org> Sun, 15 Sep 2019 13:37:18 +0200
jackson-core (2.9.8-3) unstable; urgency=medium
* Team upload.
......
......@@ -4,8 +4,9 @@ Priority: optional
Maintainer: Debian Java Maintainers <pkg-java-maintainers@lists.alioth.debian.org>
Uploaders:
Wolodja Wentland <debian@babilen5.org>
, Mechtilde Stehmann <mechtilde@debian.org>
Build-Depends:
debhelper (>= 11),
debhelper-compat (= 12),
default-jdk,
maven-debian-helper (>= 1.6.5),
xmlstarlet
......@@ -16,7 +17,7 @@ Build-Depends-Indep:
libmaven-enforcer-plugin-java,
libmaven-javadoc-plugin-java,
libreplacer-java
Standards-Version: 4.3.0
Standards-Version: 4.4.0
Vcs-Git: https://salsa.debian.org/java-team/jackson-core.git
Vcs-Browser: https://salsa.debian.org/java-team/jackson-core
Homepage: http://wiki.fasterxml.com/JacksonHome
......
......@@ -10,6 +10,7 @@ Files: debian/*
Copyright: 2013, Wolodja Wentland <debian@babilen5.org>
2014, Timo Aaltonen <tjaalton@debian.org>
2016, Emmanuel Bourg <ebourg@apache.org>
2019, Mechtilde Stehmann <mechtilde@debian.org>
License: Apache-2.0
License: Apache-2.0
......
......@@ -9,7 +9,7 @@ Maven Enforcer requires at least one valid rule. See also junit.patch.
--- a/pom.xml
+++ b/pom.xml
@@ -75,6 +75,14 @@
@@ -67,6 +67,14 @@
<id>enforce-properties</id>
<phase>validate</phase>
<goals><goal>enforce</goal></goals>
......
From: Markus Koschany <apo@debian.org>
Date: Thu, 25 Jan 2018 18:19:30 +0100
Subject: no bundle
Package FTBFS otherwise...
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Description: no bundle
Forwarded: No
Author: Mechtilde Stehmann <mechtilde@debian.org>
Last-Update: 2019-09-10
--- a/pom.xml
+++ b/pom.xml
@@ -11,7 +11,7 @@
<artifactId>jackson-core</artifactId>
<name>Jackson-core</name>
<version>2.9.8</version>
<version>2.9.9</version>
- <packaging>bundle</packaging>
+ <packaging>jar</packaging>
<description>Core Jackson processing abstractions (aka Streaming API), implementation for JSON</description>
......
include:
- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml
- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml
version=3
version=4
https://github.com/FasterXML/jackson-core/releases .*/jackson-core-(\d[\d\.]*)\.tar\.gz
......@@ -4,13 +4,13 @@
<groupId>com.fasterxml.jackson</groupId>
<!-- For 2.9.2 and beyond, new parent pom; extends jackson-bom -->
<artifactId>jackson-base</artifactId>
<version>2.9.8</version>
<version>2.9.9</version>
</parent>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<name>Jackson-core</name>
<version>2.9.8</version>
<version>2.9.9</version>
<packaging>bundle</packaging>
<description>Core Jackson processing abstractions (aka Streaming API), implementation for JSON</description>
<inceptionYear>2008</inceptionYear>
......@@ -20,7 +20,7 @@
<connection>scm:git:git@github.com:FasterXML/jackson-core.git</connection>
<developerConnection>scm:git:git@github.com:FasterXML/jackson-core.git</developerConnection>
<url>http://github.com/FasterXML/jackson-core</url>
<tag>jackson-core-2.9.8</tag>
<tag>jackson-core-2.9.9</tag>
</scm>
<properties>
......
......@@ -156,3 +156,10 @@ Doug Roper (htmldoug@github)
exception if not enough input
(2.9.6)
Alexander Eyers-Taylor (aeyerstaylor@github)
* Reported #510: Fix ArrayIndexOutofBoundsException found by LGTM.com
(2.9.9)
Henrik Gustafsson (gsson@github)
* Reported #516: _inputPtr off-by-one in UTF8StreamJsonParser._parseNumber2()
(2.9.9)
......@@ -14,10 +14,19 @@ JSON library.
=== Releases ===
------------------------------------------------------------------------
2.9.9 (16-May-2019)
#516: _inputPtr off-by-one in UTF8StreamJsonParser._parseNumber2()
(reported by Henrik G)
#531: Non-blocking parser reports incorrect locations when fed with non-zero offset
(reported by David N)
2.9.8 (15-Dec-2018)
#488: Fail earlier on coercions from "too big" `BigInteger` into
fixed-size types (`int`, `long`, `short`)
#510: Fix ArrayIndexOutofBoundsException found by LGTM.com
(reported by Alexander E-T)
- Improve exception message for missing Base64 padding (see databind#2183)
2.9.7 (19-Sep-2018)
......
......@@ -1960,7 +1960,7 @@ public class ReaderBasedJsonParser // final in 2.3, earlier
}
char c = _inputBuffer[_inputPtr];
int i = (int) c;
if (i <= maxCode) {
if (i < maxCode) {
if (codes[i] != 0) {
break;
}
......
......@@ -1467,7 +1467,7 @@ public class UTF8StreamJsonParser
_textBuffer.setCurrentLength(outPtr);
// As per #105, need separating space between root values; check here
if (_parsingContext.inRoot()) {
_verifyRootSpace(_inputBuffer[_inputPtr++] & 0xFF);
_verifyRootSpace(_inputBuffer[_inputPtr] & 0xFF);
}
// And there we have it!
......
......@@ -94,6 +94,7 @@ public class NonBlockingJsonParser
_currInputRowStart = start - (_inputEnd - _currInputRowStart);
// And then update buffer settings
_currBufferStart = start;
_inputBuffer = buf;
_inputPtr = start;
_inputEnd = end;
......
......@@ -79,7 +79,7 @@ public class TestRootValues
_testSimpleWrites(true);
}
public void _testSimpleWrites(boolean useStream) throws Exception
private void _testSimpleWrites(boolean useStream) throws Exception
{
ByteArrayOutputStream out = new ByteArrayOutputStream();
StringWriter w = new StringWriter();
......@@ -102,4 +102,102 @@ public class TestRootValues
String json = useStream ? out.toString("UTF-8") : w.toString();
assertEquals("123 \"abc\" true", json);
}
// [core#516]: Off-by-one read problem
public void testRootOffsetIssue516Bytes() throws Exception
{
// InputStream that forces _parseNumber2 to be invoked.
final InputStream in = new Issue516InputStream(new byte[][] {
"1234".getBytes("UTF-8"),
"5 true".getBytes("UTF-8")
});
JsonParser parser = JSON_F.createParser(in);
assertEquals(12345, parser.nextIntValue(0));
// Fails with com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'rue': was expecting ('true', 'false' or 'null')
assertTrue(parser.nextBooleanValue());
parser.close();
in.close();
}
// [core#516]: Off-by-one read problem
public void testRootOffsetIssue516Chars() throws Exception
{
// InputStream that forces _parseNumber2 to be invoked.
final Reader in = new Issue516Reader(new char[][] {
"1234".toCharArray(), "5 true".toCharArray()
});
JsonParser parser = JSON_F.createParser(in);
assertEquals(12345, parser.nextIntValue(0));
// Fails with com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'rue': was expecting ('true', 'false' or 'null')
assertTrue(parser.nextBooleanValue());
parser.close();
in.close();
}
static class Issue516InputStream extends InputStream
{
private final byte[][] reads;
private int currentRead;
public Issue516InputStream(byte[][] reads) {
this.reads = reads;
this.currentRead = 0;
}
@Override
public int read() throws IOException {
throw new UnsupportedOperationException();
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
if (currentRead >= reads.length) {
return -1;
}
byte[] bytes = reads[currentRead++];
if (len < bytes.length) {
throw new IllegalArgumentException();
}
System.arraycopy(bytes, 0, b, off, bytes.length);
return bytes.length;
}
}
static class Issue516Reader extends Reader
{
private final char[][] reads;
private int currentRead;
public Issue516Reader(char[][] reads) {
this.reads = reads;
this.currentRead = 0;
}
@Override
public void close() { }
@Override
public int read() throws IOException {
throw new UnsupportedOperationException();
}
@Override
public int read(char[] b, int off, int len) throws IOException {
if (currentRead >= reads.length) {
return -1;
}
char[] bytes = reads[currentRead++];
if (len < bytes.length) {
throw new IllegalArgumentException();
}
System.arraycopy(bytes, 0, b, off, bytes.length);
return bytes.length;
}
}
}
package com.fasterxml.jackson.core.json.async;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.async.AsyncTestBase;
import com.fasterxml.jackson.core.async.ByteArrayFeeder;
public class AsyncLocationTest extends AsyncTestBase
{
private final JsonFactory DEFAULT_F = new JsonFactory();
// for [core#531]
public void testLocationOffsets() throws Exception
{
JsonParser parser = DEFAULT_F.createNonBlockingByteArrayParser();
ByteArrayFeeder feeder = (ByteArrayFeeder) parser.getNonBlockingInputFeeder();
byte[] input = utf8Bytes("[[[");
feeder.feedInput(input, 2, 3);
assertEquals(JsonToken.START_ARRAY, parser.nextToken());
assertEquals(1, parser.getCurrentLocation().getByteOffset());
assertEquals(1, parser.getTokenLocation().getByteOffset());
assertEquals(1, parser.getCurrentLocation().getLineNr());
assertEquals(1, parser.getTokenLocation().getLineNr());
assertEquals(2, parser.getCurrentLocation().getColumnNr());
assertEquals(1, parser.getTokenLocation().getColumnNr());
feeder.feedInput(input, 0, 1);
assertEquals(JsonToken.START_ARRAY, parser.nextToken());
assertEquals(2, parser.getCurrentLocation().getByteOffset());
assertEquals(2, parser.getTokenLocation().getByteOffset());
assertEquals(1, parser.getCurrentLocation().getLineNr());
assertEquals(1, parser.getTokenLocation().getLineNr());
assertEquals(3, parser.getCurrentLocation().getColumnNr());
assertEquals(2, parser.getTokenLocation().getColumnNr());
parser.close();
}
}
package com.fasterxml.jackson.core.main;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.testsupport.ByteOutputStreamForTesting;
import com.fasterxml.jackson.core.testsupport.StringWriterForTesting;
import java.io.*;
......@@ -19,64 +20,6 @@ import java.io.*;
*/
public class TestGeneratorClosing extends BaseTest
{
/*
/**********************************************************
/* Helper classes
/**********************************************************
*/
final static class MyWriter extends StringWriter
{
boolean _isClosed = false;
public MyWriter() { }
@Override
public void close() throws IOException {
_isClosed = true;
super.close();
}
public boolean isClosed() { return _isClosed; }
}
final static class MyStream extends ByteArrayOutputStream
{
boolean _isClosed = false;
public MyStream() { }
@Override
public void close() throws IOException {
_isClosed = true;
super.close();
}
public boolean isClosed() { return _isClosed; }
}
static class MyBytes extends ByteArrayOutputStream
{
public int flushed = 0;
@Override
public void flush() throws IOException
{
++flushed;
super.flush();
}
}
static class MyChars extends StringWriter
{
public int flushed = 0;
@Override
public void flush()
{
++flushed;
super.flush();
}
}
/*
/**********************************************************
/* Unit tests
......@@ -98,7 +41,7 @@ public class TestGeneratorClosing extends BaseTest
f.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET);
assertFalse(f.isEnabled(JsonGenerator.Feature.AUTO_CLOSE_TARGET));
@SuppressWarnings("resource")
MyWriter output = new MyWriter();
ByteOutputStreamForTesting output = new ByteOutputStreamForTesting();
JsonGenerator jg = f.createGenerator(output);
// shouldn't be closed to begin with...
......@@ -114,7 +57,7 @@ public class TestGeneratorClosing extends BaseTest
JsonFactory f = new JsonFactory();
f.enable(JsonGenerator.Feature.AUTO_CLOSE_TARGET);
@SuppressWarnings("resource")
MyWriter output = new MyWriter();
ByteOutputStreamForTesting output = new ByteOutputStreamForTesting();
JsonGenerator jg = f.createGenerator(output);
// shouldn't be closed to begin with...
......@@ -130,7 +73,7 @@ public class TestGeneratorClosing extends BaseTest
JsonFactory f = new JsonFactory();
f.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET);
@SuppressWarnings("resource")
MyStream output = new MyStream();
ByteOutputStreamForTesting output = new ByteOutputStreamForTesting();
JsonGenerator jg = f.createGenerator(output, JsonEncoding.UTF8);
assertFalse(output.isClosed());
......@@ -181,53 +124,52 @@ public class TestGeneratorClosing extends BaseTest
assertEquals("{", sw.toString());
}
// [JACKSON-401]
@SuppressWarnings("resource")
public void testAutoFlushOrNot() throws Exception
{
JsonFactory f = new JsonFactory();
assertTrue(f.isEnabled(JsonGenerator.Feature.FLUSH_PASSED_TO_STREAM));
MyChars sw = new MyChars();
StringWriterForTesting sw = new StringWriterForTesting();
JsonGenerator jg = f.createGenerator(sw);
jg.writeStartArray();
jg.writeEndArray();
assertEquals(0, sw.flushed);
assertEquals(0, sw.flushCount);
jg.flush();
assertEquals(1, sw.flushed);
assertEquals(1, sw.flushCount);
jg.close();
// ditto with stream
MyBytes bytes = new MyBytes();
ByteOutputStreamForTesting bytes = new ByteOutputStreamForTesting();
jg = f.createGenerator(bytes, JsonEncoding.UTF8);
jg.writeStartArray();
jg.writeEndArray();
assertEquals(0, bytes.flushed);
assertEquals(0, bytes.flushCount);
jg.flush();
assertEquals(1, bytes.flushed);
assertEquals(1, bytes.flushCount);
assertEquals(2, bytes.toByteArray().length);
jg.close();
// then disable and we should not see flushing again...
f.disable(JsonGenerator.Feature.FLUSH_PASSED_TO_STREAM);
// first with a Writer
sw = new MyChars();
sw = new StringWriterForTesting();
jg = f.createGenerator(sw);
jg.writeStartArray();
jg.writeEndArray();
assertEquals(0, sw.flushed);
assertEquals(0, sw.flushCount);
jg.flush();
assertEquals(0, sw.flushed);
assertEquals(0, sw.flushCount);
jg.close();
assertEquals("[]", sw.toString());
// and then with OutputStream
bytes = new MyBytes();
bytes = new ByteOutputStreamForTesting();
jg = f.createGenerator(bytes, JsonEncoding.UTF8);
jg.writeStartArray();
jg.writeEndArray();
assertEquals(0, bytes.flushed);
assertEquals(0, bytes.flushCount);
jg.flush();
assertEquals(0, bytes.flushed);
assertEquals(0, bytes.flushCount);
jg.close();
assertEquals(2, bytes.toByteArray().length);
}
......
......@@ -461,7 +461,7 @@ public class JsonParserTest extends BaseTest
p = JSON_FACTORY.createParser(new MockDataInput(input));
assertEquals(JsonToken.START_ARRAY, p.nextToken());
// same BOM, but DataInput is more restrctive so can skip but offsets
// same BOM, but DataInput is more restrictive so can skip but offsets
// are not reliable...
loc = p.getTokenLocation();
assertNotNull(loc);
......
......@@ -5,24 +5,6 @@ import com.fasterxml.jackson.core.*;
public class NonStandardParserFeaturesTest
extends com.fasterxml.jackson.core.BaseTest
{
public void testSimpleUnquotedBytes() throws Exception {
_testSimpleUnquoted(MODE_INPUT_STREAM);
_testSimpleUnquoted(MODE_INPUT_STREAM_THROTTLED);
_testSimpleUnquoted(MODE_DATA_INPUT);
}
public void testSimpleUnquotedChars() throws Exception {
_testSimpleUnquoted(MODE_READER);
}
public void testLargeUnquoted() throws Exception
{
_testLargeUnquoted(MODE_INPUT_STREAM);
_testLargeUnquoted(MODE_INPUT_STREAM_THROTTLED);
_testLargeUnquoted(MODE_DATA_INPUT);
_testLargeUnquoted(MODE_READER);
}
public void testSingleQuotesDefault() throws Exception
{
_testSingleQuotesDefault(MODE_INPUT_STREAM);
......@@ -98,88 +80,6 @@ public class NonStandardParserFeaturesTest
/****************************************************************
*/
private void _testLargeUnquoted(int mode) throws Exception
{
StringBuilder sb = new StringBuilder(5000);
sb.append("[\n");
//final int REPS = 2000;
final int REPS = 1050;
for (int i = 0; i < REPS; ++i) {
if (i > 0) {
sb.append(',');
if ((i & 7) == 0) {
sb.append('\n');
}
}
sb.append("{");
sb.append("abc").append(i&127).append(':');
sb.append((i & 1) != 0);
sb.append("}\n");
}
sb.append("]");
String JSON = sb.toString();
JsonFactory f = new JsonFactory();
f.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
JsonParser p = createParser(f, mode, JSON);
assertToken(JsonToken.START_ARRAY, p.nextToken());
for (int i = 0; i < REPS; ++i) {
assertToken(JsonToken.START_OBJECT, p.nextToken());
assertToken(JsonToken.FIELD_NAME, p.nextToken());
assertEquals("abc"+(i&127), p.getCurrentName());
assertToken(((i&1) != 0) ? JsonToken.VALUE_TRUE : JsonToken.VALUE_FALSE, p.nextToken());
assertToken(JsonToken.END_OBJECT, p.nextToken());
}
assertToken(JsonToken.END_ARRAY, p.nextToken());
p.close();
}
private void _testSimpleUnquoted(int mode) throws Exception
{
final JsonFactory f = new JsonFactory();
f.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
String JSON = "{ a : 1, _foo:true, $:\"money!\", \" \":null }";
JsonParser p = createParser(f, mode, JSON);
assertToken(JsonToken.START_OBJECT, p.nextToken());
assertToken(JsonToken.FIELD_NAME, p.nextToken());
assertEquals("a", p.getCurrentName());
assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken());
assertToken(JsonToken.FIELD_NAME, p.nextToken());
assertEquals("_foo", p.getCurrentName());
assertToken(JsonToken.VALUE_TRUE, p.nextToken());
assertToken(JsonToken.FIELD_NAME, p.nextToken());
assertEquals("$", p.getCurrentName());
assertToken(JsonToken.VALUE_STRING, p.nextToken());
assertEquals("money!", p.getText());
// and then regular quoted one should still work too:
assertToken(JsonToken.FIELD_NAME, p.nextToken());
assertEquals(" ", p.getCurrentName());
assertToken(JsonToken.VALUE_NULL, p.nextToken());
assertToken(JsonToken.END_OBJECT, p.nextToken());
p.close();
// Another thing, as per [Issue#102]: numbers
JSON = "{ 123:true,4:false }";
p = createParser(f, mode, JSON);
assertToken(JsonToken.START_OBJECT, p.nextToken());
assertToken(JsonToken.FIELD_NAME, p.nextToken());
assertEquals("123", p.getCurrentName());
assertToken(JsonToken.VALUE_TRUE, p.nextToken());
assertToken(JsonToken.FIELD_NAME, p.nextToken());
assertEquals("4", p.getCurrentName());
assertToken(JsonToken.VALUE_FALSE, p.nextToken());
assertToken(JsonToken.END_OBJECT, p.nextToken());
p.close();
}
/**
* Test to verify that the default parser settings do not
......
package com.fasterxml.jackson.core.read;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
public class NonStandardUnquotedNamesTest
extends com.fasterxml.jackson.core.BaseTest
{
private final JsonFactory UNQUOTED_FIELDS_F = new JsonFactory();
{
UNQUOTED_FIELDS_F.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
}
public void testSimpleUnquotedBytes() throws Exception {
_testSimpleUnquoted(MODE_INPUT_STREAM);
_testSimpleUnquoted(MODE_INPUT_STREAM_THROTTLED);
_testSimpleUnquoted(MODE_DATA_INPUT);
}
public void testSimpleUnquotedChars() throws Exception {
_testSimpleUnquoted(MODE_READER);
}
public void testLargeUnquoted() throws Exception
{
_testLargeUnquoted(MODE_INPUT_STREAM);
_testLargeUnquoted(MODE_INPUT_STREAM_THROTTLED);
_testLargeUnquoted(MODE_DATA_INPUT);
_testLargeUnquoted(MODE_READER);
}
// [core#510]: ArrayIndexOutOfBounds
public void testUnquotedIssue510() throws Exception
{
// NOTE! Requires longer input buffer to trigger longer codepath
char[] fullChars = new char[4001];
for (int i = 0; i < 3998; i++) {
fullChars[i] = ' ';
}
fullChars[3998] = '{';
fullChars[3999] = 'a';
fullChars[4000] = 256;
JsonParser p = UNQUOTED_FIELDS_F.createParser(new java.io.StringReader(new String(fullChars)));
assertToken(JsonToken.START_OBJECT, p.nextToken());
try {
p.nextToken();
fail("Should not pass");
} catch (JsonParseException e) {
; // should fail here
}
p.close();
}
/*
/****************************************************************
/* Secondary test methods
/****************************************************************
*/
private void _testLargeUnquoted(int mode) throws Exception
{
StringBuilder sb = new StringBuilder(5000);
sb.append("[\n");
//final int REPS = 2000;
final int REPS = 1050;
for (int i = 0; i < REPS; ++i) {
if (i > 0) {
sb.append(',');
if ((i & 7) == 0) {
sb.append('\n');
}
}
sb.append("{");
sb.append("abc").append(i&127).append(':');
sb.append((i & 1) != 0);
sb.append("}\n");
}
sb.append("]");
String JSON = sb.toString();
JsonParser p = createParser(UNQUOTED_FIELDS_F, mode, JSON);
assertToken(JsonToken.START_ARRAY, p.nextToken());
for (int i = 0; i < REPS; ++i) {
assertToken(JsonToken.START_OBJECT, p.nextToken());
assertToken(JsonToken.FIELD_NAME, p.nextToken());
assertEquals("abc"+(i&127), p.getCurrentName());
assertToken(((i&1) != 0) ? JsonToken.VALUE_TRUE : JsonToken.VALUE_FALSE, p.nextToken());
assertToken(JsonToken.END_OBJECT, p.nextToken());
}
assertToken(JsonToken.END_ARRAY, p.nextToken());
p.close();
}
private void _testSimpleUnquoted(int mode) throws Exception
{
String JSON = "{ a : 1, _foo:true, $:\"money!\", \" \":null }";
JsonParser p = createParser(UNQUOTED_FIELDS_F, mode, JSON);
assertToken(JsonToken.START_OBJECT, p.nextToken());
assertToken(JsonToken.FIELD_NAME, p.nextToken());
assertEquals("a", p.getCurrentName());
assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken());
assertToken(JsonToken.FIELD_NAME, p.nextToken());
assertEquals("_foo", p.getCurrentName());
assertToken(JsonToken.VALUE_TRUE, p.nextToken());
assertToken(JsonToken.FIELD_NAME, p.nextToken());
assertEquals("$", p.getCurrentName());
assertToken(JsonToken.VALUE_STRING, p.nextToken());
assertEquals("money!", p.getText());
// and then regular quoted one should still work too:
assertToken(JsonToken.FIELD_NAME, p.nextToken());
assertEquals(" ", p.getCurrentName());
assertToken(JsonToken.VALUE_NULL, p.nextToken());
assertToken(JsonToken.END_OBJECT, p.nextToken());
p.close();
// Another thing, as per [Issue#102]: numbers
JSON = "{ 123:true,4:false }";
p = createParser(UNQUOTED_FIELDS_F, mode, JSON);
assertToken(JsonToken.START_OBJECT, p.nextToken());
assertToken(JsonToken.FIELD_NAME, p.nextToken());
assertEquals("123", p.getCurrentName());
assertToken(JsonToken.VALUE_TRUE, p.nextToken());
assertToken(JsonToken.FIELD_NAME, p.nextToken());
assertEquals("4", p.getCurrentName());
assertToken(JsonToken.VALUE_FALSE, p.nextToken());
assertToken(JsonToken.END_OBJECT, p.nextToken());
p.close();
}
}