2021年4月11日星期日

De-serialize JSON Object to a java.util.Set

How do you serialize a JSON object into a custom java.util.Set?

Consider this code:

@JsonSerialize(using = SingleSetSerializer.class)  public class SingleSet<Key> implements Set<Key> {      private Set<Key> keys = new HashSet<Key>();        public SingleSet(Key key) {          this.keys = new HashSet<Key>( new ArrayList<Key>(Collections.nCopies(1, key)));      }  }  

With this serializer:

public class SingleSetSerializer extends StdSerializer<SingleSet> {      public SingleSetSerializer() {          this(null);      }        protected SingleSetSerializer(Class<SingleSet> t) {          super(t);      }        @Override      public void serialize(SingleSet value,                            JsonGenerator gen,                            SerializerProvider provider) throws IOException {          Object obj  = value.iterator().next();          if(Objects.nonNull(obj)) {              if(Key.class.isAssignableFrom(obj.getClass())) {                  Key key = (Key) obj;                  gen.writeStartObject();                  gen.writeStringField("entityType", key.getEntityType());                  gen.writeStringField("entityId", key.getEntityId());                  gen.writeEndObject();              } else {                  throw new IllegalArgumentException("Type not supported: " + obj.getClass());              }          }      }  }  

Serialization works okay, but the problem is the deserialization cannot process a JSON object into a SingleSet, and throws this error:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.HashSet` out of START_OBJECT token   at [Source: (String)"{"metaData":{"key":{"entityType":"Blog","entityId":"0-1"}},"properties":{"slug":{"stringValue":"a-blog"}},"links":{"next":{"entityType":"Blog","entityId":"0-2"},"previous":{"entityType":"Blog","entityId":"0-0"}}}"; line: 1, column: 123] (through reference chain: company.Entity["links"]->java.util.LinkedHashMap["next"])        at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)      at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1342)      at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1138)      at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1092)      at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.handleNonArray(CollectionDeserializer.java:332)      at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:265)      at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245)      at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:27)      at com.fasterxml.jackson.databind.deser.std.MapDeserializer._readAndBindStringKeyMap(MapDeserializer.java:527)      at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:364)      at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:29)      at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:136)      at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)      at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)      at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013)      at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3004)  
https://stackoverflow.com/questions/67051548/de-serialize-json-object-to-a-java-util-set April 12, 2021 at 09:05AM

没有评论:

发表评论