| package com.fasterxml.jackson.databind.node; |
| |
| import java.io.*; |
| import java.util.*; |
| |
| import com.fasterxml.jackson.core.*; |
| import com.fasterxml.jackson.databind.*; |
| import com.fasterxml.jackson.databind.node.TestTreeDeserialization.Bean; |
| |
| /** |
| * This unit test suite tries to verify that ObjectMapper |
| * can properly parse JSON and bind contents into appropriate |
| * JsonNode instances. |
| */ |
| public class TreeReadViaMapperTest extends BaseMapTest |
| { |
| public void testSimple() throws Exception |
| { |
| final String JSON = SAMPLE_DOC_JSON_SPEC; |
| |
| for (int type = 0; type < 2; ++type) { |
| JsonNode result; |
| |
| if (type == 0) { |
| result = objectMapper().readTree(new StringReader(JSON)); |
| } else { |
| result = objectMapper().readTree(JSON); |
| } |
| |
| assertType(result, ObjectNode.class); |
| assertEquals(1, result.size()); |
| assertTrue(result.isObject()); |
| |
| ObjectNode main = (ObjectNode) result; |
| assertEquals("Image", main.fieldNames().next()); |
| JsonNode ob = main.elements().next(); |
| assertType(ob, ObjectNode.class); |
| ObjectNode imageMap = (ObjectNode) ob; |
| |
| assertEquals(5, imageMap.size()); |
| ob = imageMap.get("Width"); |
| assertTrue(ob.isIntegralNumber()); |
| assertFalse(ob.isFloatingPointNumber()); |
| assertEquals(SAMPLE_SPEC_VALUE_WIDTH, ob.intValue()); |
| ob = imageMap.get("Height"); |
| assertTrue(ob.isIntegralNumber()); |
| assertEquals(SAMPLE_SPEC_VALUE_HEIGHT, ob.intValue()); |
| |
| ob = imageMap.get("Title"); |
| assertTrue(ob.isTextual()); |
| assertEquals(SAMPLE_SPEC_VALUE_TITLE, ob.textValue()); |
| |
| ob = imageMap.get("Thumbnail"); |
| assertType(ob, ObjectNode.class); |
| ObjectNode tn = (ObjectNode) ob; |
| ob = tn.get("Url"); |
| assertTrue(ob.isTextual()); |
| assertEquals(SAMPLE_SPEC_VALUE_TN_URL, ob.textValue()); |
| ob = tn.get("Height"); |
| assertTrue(ob.isIntegralNumber()); |
| assertEquals(SAMPLE_SPEC_VALUE_TN_HEIGHT, ob.intValue()); |
| ob = tn.get("Width"); |
| assertTrue(ob.isTextual()); |
| assertEquals(SAMPLE_SPEC_VALUE_TN_WIDTH, ob.textValue()); |
| |
| ob = imageMap.get("IDs"); |
| assertTrue(ob.isArray()); |
| ArrayNode idList = (ArrayNode) ob; |
| assertEquals(4, idList.size()); |
| assertEquals(4, calcLength(idList.elements())); |
| assertEquals(4, calcLength(idList.iterator())); |
| { |
| int[] values = new int[] { |
| SAMPLE_SPEC_VALUE_TN_ID1, |
| SAMPLE_SPEC_VALUE_TN_ID2, |
| SAMPLE_SPEC_VALUE_TN_ID3, |
| SAMPLE_SPEC_VALUE_TN_ID4 |
| }; |
| for (int i = 0; i < values.length; ++i) { |
| assertEquals(values[i], idList.get(i).intValue()); |
| } |
| int i = 0; |
| for (JsonNode n : idList) { |
| assertEquals(values[i], n.intValue()); |
| ++i; |
| } |
| } |
| } |
| } |
| |
| public void testMixed() throws IOException |
| { |
| ObjectMapper om = new ObjectMapper(); |
| String JSON = "{\"node\" : { \"a\" : 3 }, \"x\" : 9 }"; |
| Bean bean = om.readValue(JSON, Bean.class); |
| |
| assertEquals(9, bean._x); |
| JsonNode n = bean._node; |
| assertNotNull(n); |
| assertEquals(1, n.size()); |
| ObjectNode on = (ObjectNode) n; |
| assertEquals(3, on.get("a").intValue()); |
| } |
| |
| /** |
| * Type mappers should be able to gracefully deal with end of |
| * input. |
| */ |
| public void testEOF() throws Exception |
| { |
| String JSON = |
| "{ \"key\": [ { \"a\" : { \"name\": \"foo\", \"type\": 1\n" |
| +"}, \"type\": 3, \"url\": \"http://www.google.com\" } ],\n" |
| +"\"name\": \"xyz\", \"type\": 1, \"url\" : null }\n " |
| ; |
| JsonFactory jf = new JsonFactory(); |
| JsonParser p = jf.createParser(new StringReader(JSON)); |
| JsonNode result = objectMapper().readTree(p); |
| |
| assertTrue(result.isObject()); |
| assertEquals(4, result.size()); |
| |
| assertNull(objectMapper().readTree(p)); |
| p.close(); |
| } |
| |
| public void testMultiple() throws Exception |
| { |
| String JSON = "12 \"string\" [ 1, 2, 3 ]"; |
| JsonFactory jf = new JsonFactory(); |
| JsonParser p = jf.createParser(new StringReader(JSON)); |
| final ObjectMapper mapper = objectMapper(); |
| JsonNode result = mapper.readTree(p); |
| |
| assertTrue(result.isIntegralNumber()); |
| assertTrue(result.isInt()); |
| assertFalse(result.isTextual()); |
| assertEquals(12, result.intValue()); |
| |
| result = mapper.readTree(p); |
| assertTrue(result.isTextual()); |
| assertFalse(result.isIntegralNumber()); |
| assertFalse(result.isInt()); |
| assertEquals("string", result.textValue()); |
| |
| result = mapper.readTree(p); |
| assertTrue(result.isArray()); |
| assertEquals(3, result.size()); |
| |
| assertNull(mapper.readTree(p)); |
| p.close(); |
| } |
| |
| // [databind#1406] |
| public void testNullFromEOFViaMapper() throws Exception |
| { |
| final ObjectMapper mapper = objectMapper(); |
| |
| assertNull(mapper.readTree(new StringReader(""))); |
| assertNull(mapper.readTree(new ByteArrayInputStream(new byte[0]))); |
| } |
| |
| // [databind#1406] |
| public void testNullFromEOFViaObjectReader() throws Exception |
| { |
| final ObjectMapper mapper = objectMapper(); |
| |
| assertNull(mapper.readTree(new StringReader(""))); |
| assertNull(mapper.readTree(new ByteArrayInputStream(new byte[0]))); |
| assertNull(mapper.readerFor(JsonNode.class) |
| .readTree(new StringReader(""))); |
| assertNull(mapper.readerFor(JsonNode.class) |
| .readTree(new ByteArrayInputStream(new byte[0]))); |
| } |
| |
| /* |
| /********************************************** |
| /* Helper methods |
| /********************************************** |
| */ |
| |
| private int calcLength(Iterator<JsonNode> it) |
| { |
| int count = 0; |
| while (it.hasNext()) { |
| it.next(); |
| ++count; |
| } |
| return count; |
| } |
| } |
| |