Serialisierung generischen Java-Objekts zu JSON mit Jackson
Als ich versuchte konvertieren Sie die folgende Instanz der Klasse zu JSON (mit Jackson)
public class RPCRespond<Result> {
private int code;
private Result result;
private boolean success;
private String failureReason;
public RPCRespond() {
this.code = 0;
this.success = true;
this.result = null;
}
public RPCRespond(Result result) {
this.code = 0;
this.success = true;
this.result = result;
}
public RPCRespond(int code, String failureReason) {
this.code = code;
this.success = false;
this.failureReason = failureReason;
}
public RPCRespond(int code, String failureReason, Object... args) {
this.code = code;
this.success = false;
this.failureReason = String.format(failureReason, args);
}
public Result getResult() {
return result;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getFailureReason() {
return failureReason;
}
public void setFailureReason(String failureReason) {
this.failureReason = failureReason;
}
public int getCode() {
return code;
}
public boolean getSuccess() {
return success;
}
@Transient
public String getAsJSON() {
String json = "";
ObjectMapper mapper = new ObjectMapper();
json = mapper.writeValueAsString(this) ;
return json ;
}
}
es in Endlosschleife:
an der Sonne.reflektieren.GeneratedMethodAccessor48.invoke(Unknown Source) at Sonne.reflektieren.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) bei java.lang.reflektieren.Methode.invoke(Method.java:601) bei org.codehaus.jackson.Karte.ser.BeanPropertyWriter.bekommen(BeanPropertyWriter.java:483) bei org.codehaus.jackson.Karte.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:418) bei org.codehaus.jackson.Karte.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150) bei org.codehaus.jackson.Karte.ser.BeanSerializer.serialize(BeanSerializer.java:112) bei org.codehaus.jackson.Karte.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:610) bei org.codehaus.jackson.Karte.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:256) bei org.codehaus.jackson.Karte.ObjectMapper._configAndWriteValue(ObjectMapper.java:2566) bei org.codehaus.jackson.Karte.ObjectMapper.writeValueAsString(ObjectMapper.java:2088)
Die initiation der RPCRespond erfolgt durch
User u = new User() ;
u.setFirstName("aaaa") ;
RPCRespond<User> result = new RPCRespond<User>(u) ;
result.setSuccess(true) ;
return result.getAsJSON() ;
Wie kann ich umwandeln RPCRespond zu JSON?
InformationsquelleAutor der Frage oferbu | 2011-11-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Standardmäßig Jackson serialisieren über
get
Methoden. Einmal trifft es diegetAsJson
Methode poomEndlosschleife. Markieren Sie es mit der@JsonIgnore
annotation.Können Sie auch so konfigurieren, dass Jackson zu serialisieren, die auf der Grundlage von Eigenschaften nur, die kann die Notwendigkeit beseitigen, für die
@JsonIgnore
aber das kann oder nicht Ihren Bedürfnissen entsprechen.Ich glauben die neuesten Jackson erlaubt die Wahl der mit der Hibernate
@Transient
- Anmerkung, obwohl ich nicht sicher bin, wie es zu konfigurieren (der letzten änderung).InformationsquelleAutor der Antwort Dave Newton
Als andere haben vorgeschlagen, dies ist wahrscheinlich aufgrund von zyklischen Referenzen; standardmäßig Jackson nicht mit solchen Abhängigkeiten.
Können Sie entweder versuchen, das überspringen der Serialisierung der Eigenschaft, oder, wenn es von Eltern/Kind-Typ-Gestänge, kommentieren es als solches (siehe " bidirektionale Referenzen " - Eintrag in Jackson Wiki für mehr details).
Für was es Wert ist, generische Typen nicht bewirken, dass diese (D. H. es ist wahrscheinlich nur ein Zufall, hier); zyklische Arten sind völlig in Ordnung.
InformationsquelleAutor der Antwort StaxMan