package com.fasterxml.jackson.databind.objectid; import java.util.*; import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.*; public class ObjectIdReordering1388Test extends BaseMapTest { @JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class) public static class NamedThing { private final UUID id; private final String name; @JsonCreator public NamedThing(@JsonProperty("id") UUID id, @JsonProperty("name") String name) { this.id = id; this.name = name; } public UUID getId() { return id; } public String getName() { return name; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; NamedThing that = (NamedThing) o; return that.id.equals(id) && that.name.equals(name); } @Override public int hashCode() { return name.hashCode(); } } public void testDeserializationFinalClassJSOG() throws Exception { final ObjectMapper mapper = new ObjectMapper(); final UUID id = UUID.fromString("a59aa02c-fe3c-43f8-9b5a-5fe01878a818"); final NamedThing thing = new NamedThing(id, "Hello"); final TypeReference<?> namedThingListType = new TypeReference<List<NamedThing>>() { }; { final String jsog = mapper.writeValueAsString(Arrays.asList(thing, thing, thing)); final List<NamedThing> list = mapper.readValue(jsog, namedThingListType); _assertAllSame(list); // this is the jsog representation of the list of 3 of the same item assertTrue(jsog.equals("[{\"@id\":1,\"id\":\"a59aa02c-fe3c-43f8-9b5a-5fe01878a818\",\"name\":\"Hello\"},1,1]")); } // now move it around it have forward references // this works { final String json = "[1,1,{\"@id\":1,\"id\":\"a59aa02c-fe3c-43f8-9b5a-5fe01878a818\",\"name\":\"Hello\"}]"; final List<NamedThing> forward = mapper.readValue(json, namedThingListType); _assertAllSame(forward); } // next, move @id to between properties { final String json = aposToQuotes("[{'id':'a59aa02c-fe3c-43f8-9b5a-5fe01878a818','@id':1,'name':'Hello'}, 1, 1]"); final List<NamedThing> forward = mapper.readValue(json, namedThingListType); _assertAllSame(forward); } // and last, move @id to be not the first key in the object { final String json = aposToQuotes("[{'id':'a59aa02c-fe3c-43f8-9b5a-5fe01878a818','name':'Hello','@id':1}, 1, 1]"); final List<NamedThing> forward = mapper.readValue(json, namedThingListType); _assertAllSame(forward); } } private void _assertAllSame(List<?> entries) { Object first = entries.get(0); for (int i = 0, end = entries.size(); i < end; ++i) { if (first != entries.get(i)) { fail("Mismatch: entry #"+i+" not same as #0"); } } } }