package com.fasterxml.jackson.core.main; import java.io.*; import com.fasterxml.jackson.core.*; /** * Unit tests for verifying that object mapping functionality can * be accessed using JsonParser. */ public class TestParserWithObjects extends com.fasterxml.jackson.test.BaseTest { /* /********************************************************** /* Test for simple traversal with data mapping /********************************************************** */ public void testNextValue() throws IOException { // Let's test both byte-backed and Reader-based one _testNextValueBasic(false); _testNextValueBasic(true); } // [JACKSON-395] public void testNextValueNested() throws IOException { // Let's test both byte-backed and Reader-based one _testNextValueNested(false); _testNextValueNested(true); } public void testIsClosed() throws IOException { for (int i = 0; i < 4; ++i) { String JSON = "[ 1, 2, 3 ]"; boolean stream = ((i & 1) == 0); JsonParser jp = stream ? createParserUsingStream(JSON, "UTF-8") : createParserUsingReader(JSON); boolean partial = ((i & 2) == 0); assertFalse(jp.isClosed()); assertToken(JsonToken.START_ARRAY, jp.nextToken()); assertToken(JsonToken.VALUE_NUMBER_INT, jp.nextToken()); assertToken(JsonToken.VALUE_NUMBER_INT, jp.nextToken()); assertFalse(jp.isClosed()); if (partial) { jp.close(); assertTrue(jp.isClosed()); } else { assertToken(JsonToken.VALUE_NUMBER_INT, jp.nextToken()); assertToken(JsonToken.END_ARRAY, jp.nextToken()); assertNull(jp.nextToken()); assertTrue(jp.isClosed()); } } } /* /********************************************************** /* Supporting methods /********************************************************** */ private void _testNextValueBasic(boolean useStream) throws IOException { // first array, no change to default JsonParser jp = _getParser("[ 1, 2, 3, 4 ]", useStream); assertToken(JsonToken.START_ARRAY, jp.nextValue()); for (int i = 1; i <= 4; ++i) { assertToken(JsonToken.VALUE_NUMBER_INT, jp.nextValue()); assertEquals(i, jp.getIntValue()); } assertToken(JsonToken.END_ARRAY, jp.nextValue()); assertNull(jp.nextValue()); jp.close(); // then Object, is different jp = _getParser("{ \"3\" :3, \"4\": 4, \"5\" : 5 }", useStream); assertToken(JsonToken.START_OBJECT, jp.nextValue()); for (int i = 3; i <= 5; ++i) { assertToken(JsonToken.VALUE_NUMBER_INT, jp.nextValue()); assertEquals(String.valueOf(i), jp.getCurrentName()); assertEquals(i, jp.getIntValue()); } assertToken(JsonToken.END_OBJECT, jp.nextValue()); assertNull(jp.nextValue()); jp.close(); // and then mixed... jp = _getParser("[ true, [ ], { \"a\" : 3 } ]", useStream); assertToken(JsonToken.START_ARRAY, jp.nextValue()); assertToken(JsonToken.VALUE_TRUE, jp.nextValue()); assertToken(JsonToken.START_ARRAY, jp.nextValue()); assertToken(JsonToken.END_ARRAY, jp.nextValue()); assertToken(JsonToken.START_OBJECT, jp.nextValue()); assertToken(JsonToken.VALUE_NUMBER_INT, jp.nextValue()); assertEquals("a", jp.getCurrentName()); assertToken(JsonToken.END_OBJECT, jp.nextValue()); assertToken(JsonToken.END_ARRAY, jp.nextValue()); assertNull(jp.nextValue()); jp.close(); } // [JACKSON-395] private void _testNextValueNested(boolean useStream) throws IOException { // first array, no change to default JsonParser jp; // then object with sub-objects... jp = _getParser("{\"a\": { \"b\" : true, \"c\": false }, \"d\": 3 }", useStream); assertToken(JsonToken.START_OBJECT, jp.nextValue()); assertNull(jp.getCurrentName()); assertToken(JsonToken.START_OBJECT, jp.nextValue()); assertEquals("a", jp.getCurrentName()); assertToken(JsonToken.VALUE_TRUE, jp.nextValue()); assertEquals("b", jp.getCurrentName()); assertToken(JsonToken.VALUE_FALSE, jp.nextValue()); assertEquals("c", jp.getCurrentName()); assertToken(JsonToken.END_OBJECT, jp.nextValue()); // ideally we should match closing marker with field, too: assertEquals("a", jp.getCurrentName()); assertToken(JsonToken.VALUE_NUMBER_INT, jp.nextValue()); assertEquals("d", jp.getCurrentName()); assertToken(JsonToken.END_OBJECT, jp.nextValue()); assertNull(jp.getCurrentName()); assertNull(jp.nextValue()); jp.close(); // and arrays jp = _getParser("{\"a\": [ false ] }", useStream); assertToken(JsonToken.START_OBJECT, jp.nextValue()); assertNull(jp.getCurrentName()); assertToken(JsonToken.START_ARRAY, jp.nextValue()); assertEquals("a", jp.getCurrentName()); assertToken(JsonToken.VALUE_FALSE, jp.nextValue()); assertNull(jp.getCurrentName()); assertToken(JsonToken.END_ARRAY, jp.nextValue()); // ideally we should match closing marker with field, too: assertEquals("a", jp.getCurrentName()); assertToken(JsonToken.END_OBJECT, jp.nextValue()); assertNull(jp.getCurrentName()); assertNull(jp.nextValue()); jp.close(); } private JsonParser _getParser(String doc, boolean useStream) throws IOException { JsonFactory jf = new JsonFactory(); if (useStream) { return jf.createParser(doc.getBytes("UTF-8")); } return jf.createParser(new StringReader(doc)); } }