|
23 | 23 | import com.fasterxml.jackson.databind.DeserializationFeature; |
24 | 24 | import com.fasterxml.jackson.databind.KeyDeserializer; |
25 | 25 | import com.fasterxml.jackson.databind.ObjectMapper; |
| 26 | +import com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer; |
26 | 27 | import com.fasterxml.jackson.databind.module.SimpleModule; |
27 | 28 | import org.junit.Test; |
28 | 29 | import org.msgpack.core.MessagePack; |
29 | 30 | import org.msgpack.core.MessagePacker; |
30 | 31 |
|
| 32 | +import java.io.ByteArrayInputStream; |
31 | 33 | import java.io.ByteArrayOutputStream; |
32 | 34 | import java.io.File; |
33 | 35 | import java.io.FileInputStream; |
|
41 | 43 | import java.util.List; |
42 | 44 | import java.util.Map; |
43 | 45 |
|
| 46 | +import static org.hamcrest.MatcherAssert.assertThat; |
| 47 | +import static org.hamcrest.core.Is.is; |
| 48 | +import static org.hamcrest.core.IsInstanceOf.instanceOf; |
44 | 49 | import static org.junit.Assert.assertArrayEquals; |
45 | 50 | import static org.junit.Assert.assertEquals; |
46 | 51 | import static org.junit.Assert.assertNull; |
@@ -671,4 +676,55 @@ public Object deserializeKey(String key, DeserializationContext ctxt) |
671 | 676 | assertEquals((Integer) 2, map.get(true)); |
672 | 677 | assertEquals((Integer) 3, map.get(false)); |
673 | 678 | } |
| 679 | + |
| 680 | + public static class MyExtTypeDeserializer extends UntypedObjectDeserializer.Vanilla |
| 681 | + { |
| 682 | + @Override |
| 683 | + public Object deserialize(JsonParser p, DeserializationContext ctxt) |
| 684 | + throws IOException |
| 685 | + { |
| 686 | + Object obj = super.deserialize(p, ctxt); |
| 687 | + if (obj instanceof MessagePackExtensionType) { |
| 688 | + MessagePackExtensionType ext = (MessagePackExtensionType) obj; |
| 689 | + if (ext.getType() == 31) { |
| 690 | + if (Arrays.equals(ext.getData(), new byte[] {(byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE})) { |
| 691 | + return "Java"; |
| 692 | + } |
| 693 | + return "Not Java"; |
| 694 | + } |
| 695 | + } |
| 696 | + return obj; |
| 697 | + } |
| 698 | + } |
| 699 | + |
| 700 | + @Test |
| 701 | + public void customDeserializationForExtType() |
| 702 | + throws IOException |
| 703 | + { |
| 704 | + ByteArrayOutputStream out = new ByteArrayOutputStream(); |
| 705 | + MessagePacker packer = MessagePack.newDefaultPacker(out); |
| 706 | + packer.packArrayHeader(4); |
| 707 | + packer.packString("foo bar"); |
| 708 | + packer.packExtensionTypeHeader((byte) 31, 4); |
| 709 | + packer.addPayload(new byte[] {(byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE}); |
| 710 | + packer.packArrayHeader(1); |
| 711 | + packer.packInt(42); |
| 712 | + packer.packExtensionTypeHeader((byte) 32, 2); |
| 713 | + packer.addPayload(new byte[] {(byte) 0xAB, (byte) 0xCD}); |
| 714 | + packer.close(); |
| 715 | + |
| 716 | + ObjectMapper objectMapper = new ObjectMapper(new MessagePackFactory()); |
| 717 | + SimpleModule module = new SimpleModule("MyModule").addDeserializer(Object.class, new MyExtTypeDeserializer()); |
| 718 | + objectMapper.registerModule(module); |
| 719 | + |
| 720 | + List<Object> values = objectMapper.readValue(new ByteArrayInputStream(out.toByteArray()), new TypeReference<List<Object>>() {}); |
| 721 | + assertThat(values.size(), is(4)); |
| 722 | + assertThat((String) values.get(0), is("foo bar")); |
| 723 | + assertThat((String) values.get(1), is("Java")); |
| 724 | + assertThat(values.get(2), is(instanceOf(List.class))); |
| 725 | + List<Object> nested = (List<Object>) values.get(2); |
| 726 | + assertThat(nested.size(), is(1)); |
| 727 | + assertThat((Integer) nested.get(0), is(42)); |
| 728 | + assertThat((MessagePackExtensionType) values.get(3), is(new MessagePackExtensionType((byte) 32, new byte[] {(byte) 0xAB, (byte) 0xCD}))); |
| 729 | + } |
674 | 730 | } |
0 commit comments