Mam dwie klasy Java, które chcę serializować do JSON przy użyciu Jacksona:
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;
}
}
Chcę serializować element do tego JSON:
{"id":7, "itemNr":"TEST", "createdBy":3}
z serializacją użytkownika, aby zawierał tylko id. Będę również mógł serilizować wszystkie obiekty użytkownika do JSON, takie jak:
{"id":3, "name": "Jonas", "email": "jonas@example.com"}
Więc myślę, że muszę napisać niestandardowy serializator Itemi wypróbować z tym:
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();
}
}
Serializuję JSON za pomocą tego kodu z 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();
}
Ale pojawia się ten błąd:
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)
Jak mogę używać niestandardowego serializatora z Jacksonem?
Tak bym to zrobił z Gsonem:
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);
Ale muszę to teraz zrobić z Jacksonem, ponieważ Gson nie obsługuje interfejsów.
Item? Mam problem polegający na tym, że moja metoda kontrolera zwraca standardowy serializowany obiektTypeA, ale dla innej określonej metody kontrolera chcę serializować go inaczej. Jakby to wyglądało?