I am trying to serialize a HashMap from Object to Strings, but the specific object has a reference to the current class leading to infinite recursion, which does not seem to be resolved using the usual JsonIdentifyInfo annotation. Here is an example:
public class CircularKey { public void start() throws IOException { ObjectMapper mapper = new ObjectMapper(); Cat cat = new Cat(); // Encode String json = mapper.writeValueAsString(cat); System.out.println(json); // Decode Cat cat2 = mapper.readValue(json, Cat.class); System.out.println(mapper.writeValueAsString(cat2)); } } @JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id") @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class") class Mouse { int id; @JsonProperty Cat cat; } @JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id") @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class") class Cat { int id; @JsonSerialize(keyUsing = MouseMapKeySerializer.class) @JsonDeserialize(keyUsing = MouseMapKeyDeserializer.class) @JsonProperty HashMap<Mouse, String> status = new HashMap<Mouse, String>(); public Cat() { Mouse m = new Mouse(); m.cat = this; status.put(m, "mike"); } }
Here's the serializer / deserializer for the key:
class MouseMapKeySerializer extends JsonSerializer<Mouse> { static ObjectMapper mapper = new ObjectMapper(); @Override public void serialize(Mouse value, JsonGenerator generator, SerializerProvider provider) throws IOException, JsonProcessingException { String json = mapper.writeValueAsString(value); generator.writeFieldName(json); } } class MouseMapKeyDeserializer extends KeyDeserializer { static ObjectMapper mapper = new ObjectMapper(); @Override public Mouse deserializeKey(String c, DeserializationContext ctx) throws IOException, JsonProcessingException { return mapper.readValue(c, Mouse.class); } }
If I switch the map to HashMap (String, Object), it works, but I can’t change the original display. Any ideas?
source share