Jackson'ı kullanarak JSON'a serileştirmek istediğim iki Java sınıfım var:
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;
}
}
Bir Öğeyi bu JSON'a serileştirmek istiyorum:
{"id":7, "itemNr":"TEST", "createdBy":3}
Kullanıcı yalnızca id. Ayrıca tüm kullanıcı nesnelerini JSON'a serilize edebileceğim gibi:
{"id":3, "name": "Jonas", "email": "jonas@example.com"}
Sanırım bunun için özel bir serileştirici yazmam Itemve bununla denemem gerekiyor :
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();
}
}
JSON'u Jackson How-to: Custom Serializers'daki şu kodla serileştiriyorum :
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();
}
Ama şu hatayı alıyorum:
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)
Jackson ile özel bir Serileştiriciyi nasıl kullanabilirim?
Gson ile bunu şu şekilde yapardım:
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);
Ama bunu Jackson ile yapmam gerekiyor çünkü Gson arayüzler için desteğe sahip değil.
Item? Denetleyici yöntemimin standart bir serileştirilmiş nesne döndürdüğü bir sorun yaşıyorumTypeA, ancak başka bir belirli denetleyici yöntemi için, onu farklı şekilde serileştirmek istiyorum. Bu neye benzerdi?