sirve que para objeto ejemplos ejemplo deserializar convertir convert con java jackson

que - json ejemplos en java



Serialización de un objeto java genérico a JSON usando Jackson (2)

Como otros han sugerido, esto es muy probablemente debido a referencias cíclicas; por defecto Jackson no maneja tales dependencias.

Puede intentar omitir la serialización de esa propiedad o, si es un enlace de tipo padre / hijo, anotarlo como tal (consulte la entrada " Referencias bidireccionales " en Jackson Wiki para obtener más detalles).

Para lo que vale, los tipos genéricos no causan esto (es decir, probablemente solo sea una coincidencia aquí); Los tipos cíclicos están perfectamente bien.

Cuando intenté convertir la siguiente instancia de clase a JSON (usando 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 ; } }

se mete en el bucle infinito de:

at sun.reflect.GeneratedMethodAccessor48.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.codehaus.jackson.map.ser.BeanPropertyWriter.get(BeanPropertyWriter.java:483) at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:418) at org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150) at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112) at org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:610) at org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:256) at org.codehaus.jackson.map.ObjectMapper._configAndWriteValue(ObjectMapper.java:2566) at org.codehaus.jackson.map.ObjectMapper.writeValueAsString(ObjectMapper.java:2088)

La iniciación del RPCRespond se realiza mediante

User u = new User() ; u.setFirstName("aaaa") ; RPCRespond<User> result = new RPCRespond<User>(u) ; result.setSuccess(true) ; return result.getAsJSON() ;

¿Cómo puedo convertir RPCRespond a JSON?


Por defecto, Jackson se serializará a través de métodos get . Una vez que golpea el método getAsJson , poom , bucle infinito. Marca con la anotación @JsonIgnore .

@JsonIgnore public String getAsJSON() { ObjectMapper mapper = new ObjectMapper(); return mapper.writeValueAsString(this) ; }

También puede configurar Jackson para que se serialice basándose solo en las propiedades, lo que puede eliminar la necesidad de @JsonIgnore , pero puede o no satisfacer sus necesidades.

Creo que la última @Transient Jackson permite utilizar la anotación Hibernate @Transient , aunque no estoy seguro de cómo configurarlo (cambio reciente).