Fixed [JACKSON-796]
diff --git a/release-notes/CREDITS b/release-notes/CREDITS
index 4d1bea8..d4b30f5 100644
--- a/release-notes/CREDITS
+++ b/release-notes/CREDITS
@@ -871,3 +871,7 @@
* Reported [JACKSON-778], provided test case: Incorrect detection of generic
types with TypeReference
[1.9.5]
+
+Christopher Brown:
+ * Reported [JACKSON-796]: Problems with byte[] conversion to/from JsonNode.
+ [1.9.5]
diff --git a/release-notes/VERSION b/release-notes/VERSION
index 9eb8efd..7dd58cc 100644
--- a/release-notes/VERSION
+++ b/release-notes/VERSION
@@ -20,6 +20,8 @@
* [JACKSON-779]: Problems with multi-byte UTF-8 chars in JSON comments
(reported by Alexander K)
* [JACKSON-789]: Add support for 'java.nio.charset.Charset'
+ * [JACKSON-796]: Problems with byte[] conversion to/from JsonNode.
+ (reported by Christopher B)
------------------------------------------------------------------------
=== History: ===
diff --git a/src/mapper/java/org/codehaus/jackson/map/deser/std/JsonNodeDeserializer.java b/src/mapper/java/org/codehaus/jackson/map/deser/std/JsonNodeDeserializer.java
index 41b2164..eabb1d6 100644
--- a/src/mapper/java/org/codehaus/jackson/map/deser/std/JsonNodeDeserializer.java
+++ b/src/mapper/java/org/codehaus/jackson/map/deser/std/JsonNodeDeserializer.java
@@ -253,7 +253,19 @@
return deserializeObject(jp, ctxt, nodeFactory);
case VALUE_EMBEDDED_OBJECT:
- return nodeFactory.POJONode(jp.getEmbeddedObject());
+ // [JACKSON-796]
+ {
+ Object ob = jp.getEmbeddedObject();
+ if (ob == null) { // should this occur?
+ return nodeFactory.nullNode();
+ }
+ Class<?> type = ob.getClass();
+ if (type == byte[].class) { // most common special case
+ return nodeFactory.binaryNode((byte[]) ob);
+ }
+ // any other special handling needed?
+ return nodeFactory.POJONode(ob);
+ }
case VALUE_STRING:
return nodeFactory.textNode(jp.getText());
diff --git a/src/mapper/java/org/codehaus/jackson/node/BinaryNode.java b/src/mapper/java/org/codehaus/jackson/node/BinaryNode.java
index 1ce062e..198f0b4 100644
--- a/src/mapper/java/org/codehaus/jackson/node/BinaryNode.java
+++ b/src/mapper/java/org/codehaus/jackson/node/BinaryNode.java
@@ -17,6 +17,12 @@
final byte[] _data;
+ /*
+ /**********************************************************
+ /* Construction
+ /**********************************************************
+ */
+
public BinaryNode(byte[] data)
{
_data = data;
@@ -54,6 +60,12 @@
return new BinaryNode(data, offset, length);
}
+ /*
+ /**********************************************************
+ /* General type coercions
+ /**********************************************************
+ */
+
@Override
public JsonToken asToken() {
/* No distinct type; could use one for textual values,
@@ -83,6 +95,12 @@
return Base64Variants.getDefaultVariant().encode(_data, false);
}
+ /*
+ /**********************************************************
+ /* Public API, serialization
+ /**********************************************************
+ */
+
@Override
public final void serialize(JsonGenerator jg, SerializerProvider provider)
throws IOException, JsonProcessingException
diff --git a/src/mapper/java/org/codehaus/jackson/node/POJONode.java b/src/mapper/java/org/codehaus/jackson/node/POJONode.java
index f6fbe6e..4f45a67 100644
--- a/src/mapper/java/org/codehaus/jackson/node/POJONode.java
+++ b/src/mapper/java/org/codehaus/jackson/node/POJONode.java
@@ -28,6 +28,16 @@
@Override
public boolean isPojo() { return true; }
+ @Override
+ public byte[] getBinaryValue()
+ throws IOException
+ {
+ if (_value instanceof byte[]) {
+ return (byte[]) _value;
+ }
+ return super.getBinaryValue();
+ }
+
/*
/**********************************************************
/* General type coercions
diff --git a/src/test/org/codehaus/jackson/node/TestConversions.java b/src/test/org/codehaus/jackson/node/TestConversions.java
index c288a81..c2f1414 100644
--- a/src/test/org/codehaus/jackson/node/TestConversions.java
+++ b/src/test/org/codehaus/jackson/node/TestConversions.java
@@ -150,29 +150,33 @@
Assert.assertArrayEquals(inputData, result.data);
}
- public void testEmbeddedObject() throws Exception
+ public void testBinaryData() throws Exception
{
ObjectMapper mapper = new ObjectMapper();
TokenBuffer buf = new TokenBuffer(mapper);
- buf.writeObject(new byte[0]);
+ buf.writeObject(new byte[3]);
JsonNode node = mapper.readTree(buf.asParser());
- assertTrue(node.isPojo());
- assertEquals(byte[].class, ((POJONode) node).getPojo().getClass());
+// assertTrue(node.isBinary());
+ byte[] data = node.getBinaryValue();
+ assertNotNull(data);
+ assertEquals(3, data.length);
}
+ private final Object MARKER = new Object();
+
public void testEmbeddedObjectInArray() throws Exception
{
ObjectMapper mapper = new ObjectMapper();
TokenBuffer buf = new TokenBuffer(mapper);
buf.writeStartArray();
- buf.writeObject(new byte[0]);
+ buf.writeObject(MARKER);
buf.writeEndArray();
JsonNode node = mapper.readTree(buf.asParser());
assertTrue(node.isArray());
assertEquals(1, node.size());
JsonNode n = node.get(0);
assertTrue(n.isPojo());
- assertEquals(byte[].class, ((POJONode) n).getPojo().getClass());
+ assertSame(MARKER, ((POJONode) n).getPojo());
}
public void testEmbeddedObjectInObject() throws Exception
@@ -181,14 +185,14 @@
TokenBuffer buf = new TokenBuffer(mapper);
buf.writeStartObject();
buf.writeFieldName("pojo");
- buf.writeObject(new byte[0]);
+ buf.writeObject(MARKER);
buf.writeEndObject();
JsonNode node = mapper.readTree(buf.asParser());
assertTrue(node.isObject());
assertEquals(1, node.size());
JsonNode n = node.get("pojo");
assertTrue(n.isPojo());
- assertEquals(byte[].class, ((POJONode) n).getPojo().getClass());
+ assertSame(MARKER, ((POJONode) n).getPojo());
}
}
diff --git a/src/test/org/codehaus/jackson/smile/TestSmileAsTree.java b/src/test/org/codehaus/jackson/smile/TestSmileAsTree.java
new file mode 100644
index 0000000..8745c9b
--- /dev/null
+++ b/src/test/org/codehaus/jackson/smile/TestSmileAsTree.java
@@ -0,0 +1,36 @@
+package org.codehaus.jackson.smile;
+
+import org.junit.Assert;
+
+import org.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.map.*;
+import org.codehaus.jackson.node.*;
+
+public class TestSmileAsTree extends SmileTestBase
+{
+ public void testSimple() throws Exception
+ {
+ // create the serialized JSON with byte array
+ ObjectMapper mapper = new ObjectMapper(new SmileFactory());
+
+ ObjectNode top1 = mapper.createObjectNode();
+ ObjectNode foo1 = top1.putObject("foo");
+ foo1.put("bar", "baz");
+ final String TEXT = "Caf\u00e9 1\u20ac";
+ final byte[] TEXT_BYTES = TEXT.getBytes("UTF-8");
+ foo1.put("dat", TEXT_BYTES);
+
+ byte[] doc = mapper.writeValueAsBytes(top1);
+ // now, deserialize
+ JsonNode top2 = mapper.readValue(doc, JsonNode.class);
+ JsonNode foo2 = top2.get("foo");
+ assertEquals("baz", foo2.get("bar").getTextValue());
+
+ JsonNode datNode = foo2.get("dat");
+ if (!datNode.isBinary()) {
+ fail("Expected binary node; got "+datNode.getClass().getName());
+ }
+ byte[] bytes = datNode.getBinaryValue();
+ Assert.assertArrayEquals(TEXT_BYTES, bytes);
+ }
+}