#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 был разбит на две хэш-карты с ключом в виде строки.