Saya memiliki dua kelas Java yang ingin saya serialkan ke JSON menggunakan Jackson:
public class User {
public final int id;
public final String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
}
public class Item {
public final int id;
public final String itemNr;
public final User createdBy;
public Item(int id, String itemNr, User createdBy) {
this.id = id;
this.itemNr = itemNr;
this.createdBy = createdBy;
}
}
Saya ingin membuat serial Item ke JSON ini:
{"id":7, "itemNr":"TEST", "createdBy":3}
dengan Pengguna berseri untuk hanya menyertakan id. Saya juga akan dapat mengubah semua objek pengguna ke JSON seperti:
{"id":3, "name": "Jonas", "email": "jonas@example.com"}
Jadi saya rasa saya perlu menulis serializer khusus Itemdan mencoba dengan ini:
public class ItemSerializer extends JsonSerializer<Item> {
@Override
public void serialize(Item value, JsonGenerator jgen,
SerializerProvider provider) throws IOException,
JsonProcessingException {
jgen.writeStartObject();
jgen.writeNumberField("id", value.id);
jgen.writeNumberField("itemNr", value.itemNr);
jgen.writeNumberField("createdBy", value.user.id);
jgen.writeEndObject();
}
}
Saya membuat serial JSON dengan kode ini dari Jackson How-to: Custom Serializers :
ObjectMapper mapper = new ObjectMapper();
SimpleModule simpleModule = new SimpleModule("SimpleModule",
new Version(1,0,0,null));
simpleModule.addSerializer(new ItemSerializer());
mapper.registerModule(simpleModule);
StringWriter writer = new StringWriter();
try {
mapper.writeValue(writer, myItem);
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Tapi saya mendapatkan kesalahan ini:
Exception in thread "main" java.lang.IllegalArgumentException: JsonSerializer of type com.example.ItemSerializer does not define valid handledType() (use alternative registration method?)
at org.codehaus.jackson.map.module.SimpleSerializers.addSerializer(SimpleSerializers.java:62)
at org.codehaus.jackson.map.module.SimpleModule.addSerializer(SimpleModule.java:54)
at com.example.JsonTest.main(JsonTest.java:54)
Bagaimana saya bisa menggunakan Serializer khusus dengan Jackson?
Beginilah cara saya melakukannya dengan Gson:
public class UserAdapter implements JsonSerializer<User> {
@Override
public JsonElement serialize(User src, java.lang.reflect.Type typeOfSrc,
JsonSerializationContext context) {
return new JsonPrimitive(src.id);
}
}
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(User.class, new UserAdapter());
Gson gson = builder.create();
String json = gson.toJson(myItem);
System.out.println("JSON: "+json);
Tapi saya perlu melakukannya dengan Jackson sekarang, karena Gson tidak memiliki dukungan untuk antarmuka.
Item? Saya mengalami masalah di mana metode pengontrol saya mengembalikan objek serial standarTypeA, tetapi untuk metode pengontrol khusus lainnya, saya ingin membuat serial secara berbeda. Seperti apa kelihatannya?