Сериализация, десериализация с помощью Джексона

#java #json #serialization #json-deserialization #jackson-databind

Вопрос:

Я пытался преобразовать свой объект в json и обратно, но сериализатор по умолчанию, десериализатор Джексона, не работает.

Как я могу заставить это работать? Я понимаю, что мне, возможно, потребуется написать пользовательский сериализатор, десериализатор. Как я могу это сделать? Есть ли какая-то аннотация, добавив которую код будет работать?

Вот этот объект:

 @JsonDeserialize(keyUsing = mypairDeserializer.class) @JsonSerialize(keyUsing = mypairSerializer.class) HashMaplt;Set lt; Mypair gt; , List lt; Mypair gt; gt; obj;   public class ConditionSerializer extends JsonSerializerlt;Collectionlt;mypairgt;gt; {   @Override  public void serialize(final Collectionlt;mypairgt; conditionSet, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider) throws IOException, JsonProcessingException {  jsonGenerator.writeStartObject();  jsonGenerator.writeFieldName("Pair");  jsonGenerator.writeStartArray();  for(final Condition condition: conditionSet) {  jsonGenerator.writeString(mypair.toString());  }  jsonGenerator.writeEndArray();  jsonGenerator.writeEndObject();  } }   public class mypairDeserializer extends KeyDeserializer {  ObjectMapper mapper = new ObjectMapper();  @Override  public Collectionlt;mypairgt; deserializeKey(final String key, final DeserializationContext ctxt) throws IOException, JsonProcessingException {  // return new mypair(key);  return mapper.readValue(key, Collection.class);  } }  

Комментарии:

1. Объясните, почему это не работает. Есть какие-нибудь исключения?

Ответ №1:

Еще раз привет с последнего поста,

Итак, это пример того, что вы можете сделать :

Обратите внимание , что, поскольку я не знаю, что является вашим объектом Mypair , я сделал этот пример с User классом :

 public class User {  private int id;  private String name;   public User(int id, String name) {  super();  this.id = id;  this.name = name;  }   // getters amp; setters }  

Класс, содержащий ваш сложный объект :

 public class YourClass {   @JsonSerialize(using = ComplexObjectSerializer.class)  private Maplt;Setlt;Usergt;, Listlt;Usergt;gt; object;   public YourClass(Maplt;Setlt;Usergt;, Listlt;Usergt;gt; object) {  this.object = object;  }   public Maplt;Setlt;Usergt;, Listlt;Usergt;gt; getObject() {  return object;  }   public void setObject(Maplt;Setlt;Usergt;, Listlt;Usergt;gt; object) {  this.object = object;  } }  

Пользовательский сериализатор :

 public class ComplexObjectSerializer extends StdSerializerlt;Maplt;Setlt;Usergt;, Listlt;Usergt;gt;gt; {   public ComplexObjectSerializer() {  this(null);  }   public ComplexObjectSerializer(Classlt;Maplt;Setlt;Usergt;, Listlt;Usergt;gt;gt; t) {  super(t);  }   private static final long serialVersionUID = 1L;   @Override  public void serialize(Maplt;Setlt;Usergt;, Listlt;Usergt;gt; complexObject,  JsonGenerator jsonGen, SerializerProvider arg2) throws IOException {   // Suppose you want the following json:  /**  * [ { "set":[], "list":[] } ]  */   jsonGen.writeStartArray(); // [   for (Entrylt;Setlt;Usergt;, Listlt;Usergt;gt; entry : complexObject.entrySet()) {  jsonGen.writeStartObject(); // {  jsonGen.writeObjectField("set", entry.getKey()); // It will call the default serializer for a Setlt;Usergt;, ie : [ {"id": 0, "name":"string"} ]   jsonGen.writeObjectField("list", entry.getValue()); // It will call the default serializer for a Listlt;Usergt;, ie the same thing as the Set above  jsonGen.writeEndObject(); // }  }  jsonGen.writeEndArray(); // ]  } }  

Главная :

 Maplt;Setlt;Usergt;, Listlt;Usergt;gt; complexObject = new HashMaplt;Setlt;Usergt;, Listlt;Usergt;gt;();   // Add some data in the map ...   YourClass yourClass = new YourClass(complexObject);   // Serialize your object  ObjectMapper mapper = new ObjectMapper();  String json = mapper.writeValueAsString(yourClass); // It will call your custom serializer  System.out.println(json);  

Выход :

 {  "object": [  {  "set": [  {  "id": 5,  "name": "userName5"  },  {  "id": 6,  "name": "userName6"  }  ],  "list": [  {  "id": 2,  "name": "userName2"  }  ]  },  {  "set": [  {  "id": 4,  "name": "userName4"  },  {  "id": 3,  "name": "userName3"  }  ],  "list": [  {  "id": 0,  "name": "userName0"  },  {  "id": 1,  "name": "userName1"  }  ]  }  ] }  

Комментарии:

1. Эй, спасибо за ваш ответ. Исключение, которое я получаю, — исключение InvalidDefinitionException: Не удается найти десериализатор ключа (карты) для типа [тип коллекции; класс java.util. Список, содержит [простой тип, класс mypair]]

2. В итоге исходный объект hashmap был разбит на две хэш-карты с ключом в виде строки.