Skip to content

deserialize with defaultTyping #28

@lifeinwild

Description

@lifeinwild

Why exception occur?

com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (START_OBJECT), 
expected START_ARRAY: need JSON Array to contain As.WRAPPER_ARRAY type information for class junk.deserializeTest.RisonTest$Obj1
 at [Source: (StringReader); line: 1, column: 1]
	at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
	at com.fasterxml.jackson.databind.DeserializationContext.wrongTokenException(DeserializationContext.java:1646)
	at com.fasterxml.jackson.databind.DeserializationContext.reportWrongTokenException(DeserializationContext.java:1396)
	at com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer._locateTypeId(AsArrayTypeDeserializer.java:141)
	at com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer._deserialize(AsArrayTypeDeserializer.java:96)
	at com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer.deserializeTypedFromObject(AsArrayTypeDeserializer.java:61)
	at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeWithType(BeanDeserializerBase.java:1197)
	at com.fasterxml.jackson.databind.deser.impl.TypeWrappedDeserializer.deserialize(TypeWrappedDeserializer.java:68)
	at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4482)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3434)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3402)
	at junk.deserializeTest.RisonTest.test(RisonTest.java:143)

public class RisonTest {
	public static class Obj1 {
		private int i = 1;
		private Obj2 o2 = new Obj2();

		@Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime * result + i;
			result = prime * result + ((o2 == null) ? 0 : o2.hashCode());
			return result;
		}

		@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (getClass() != obj.getClass())
				return false;
			Obj1 other = (Obj1) obj;
			if (i != other.i)
				return false;
			if (o2 == null) {
				if (other.o2 != null)
					return false;
			} else if (!o2.equals(other.o2))
				return false;
			return true;
		}

		public int getI() {
			return i;
		}

		public void setI(int i) {
			this.i = i;
		}

		public Obj2 getO2() {
			return o2;
		}

		public void setO2(Obj2 o2) {
			this.o2 = o2;
		}
	}

	public static class Obj2 {
		private int i = 2;
		private Obj3 o3 = new Obj3();

		@Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime * result + i;
			result = prime * result + ((o3 == null) ? 0 : o3.hashCode());
			return result;
		}

		@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (getClass() != obj.getClass())
				return false;
			Obj2 other = (Obj2) obj;
			if (i != other.i)
				return false;
			if (o3 == null) {
				if (other.o3 != null)
					return false;
			} else if (!o3.equals(other.o3))
				return false;
			return true;
		}

		public int getI() {
			return i;
		}

		public void setI(int i) {
			this.i = i;
		}

		public Obj3 getO3() {
			return o3;
		}

		public void setO3(Obj3 o3) {
			this.o3 = o3;
		}
	}

	public static class Obj3 {
		private int i = 3;

		@Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime * result + i;
			return result;
		}

		@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (getClass() != obj.getClass())
				return false;
			Obj3 other = (Obj3) obj;
			if (i != other.i)
				return false;
			return true;
		}

		public int getI() {
			return i;
		}

		public void setI(int i) {
			this.i = i;
		}
	}

	@Test
	public void test() throws Exception {
		PolymorphicTypeValidator ptv = BasicPolymorphicTypeValidator.builder()
				.allowIfBaseType(Obj1.class).allowIfBaseType(Obj2.class)
				.allowIfBaseType(Obj3.class).build();
		ObjectMapper O_RISON = new ObjectMapper(
				new RisonFactory().enable(RisonGenerator.Feature.O_RISON)
						.enable(RisonParser.Feature.O_RISON))
								.activateDefaultTyping(ptv,
										DefaultTyping.NON_FINAL);
		Obj1 src = new Obj1();
		String rison = O_RISON.writeValueAsString(src);
		System.out.println(rison);

		Obj1 o = O_RISON.readValue(rison, Obj1.class);
		System.out.println(src.equals(o));
	}
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions