2012-09-21 22 views
10

Quiero pasar de org.json a org.codehaus.jackson. ¿Cómo convierto el siguiente código de Java?De org.json JSONObject a org.codehaus.jackson

private JSONObject myJsonMessage(String message){ 
    JSONObject obj = new JSONObject(); 
    obj.put("message",message); 
    return obj; 
} 

Olvidé el bloque try-catch para simplificar.

Respuesta

19

En lugar de JSONObject uso de Jackson ObjectMapper y ObjectNode:

ObjectMapper mapper = new ObjectMapper(); 
ObjectNode node = mapper.createObjectNode(); 
node.put("message", "text"); 

Esto sería equivalente de Jackson de su código actual org.json.

Sin embargo, donde Jackson realmente sobresale es en su capacidad para realizar mapeos complejos entre sus clases Java (POJO) y su representación JSON, así como su API de transmisión que le permite hacer una serialización realmente rápida, al menos en comparación con org.json's contrapartes.

+0

¿Así 'jacksonObj' sería mi objeto de devolución? – kasavbere

+0

Con todas las exageraciones sobre jackson, esperaba que org.codehaus.jackson fuera más simple que org.json. Vota por tu ayuda. – kasavbere

+0

@kasavbere: He editado mi respuesta para reflejar mejor su pregunta original. En cuanto a la simplicidad, no es tan simple, pero depende de lo que quieras hacer con ella. Para serializaciones más simples, es más simple usar 'org.json'.Sin embargo, si está haciendo serializaciones de objetos grandes y tiene algunas necesidades personalizadas (por ejemplo, serializar un campo 'Fecha' como un valor' Cadena'), Jackson es, de lejos, la mejor opción, imho. –

5

No hay JSONObject en Jackson api. En lugar de devolver JSONObject, puede devolver un Mapa o un Java Bean con la propiedad de mensaje que tiene getters y setters para él.

public class MyMessage { 
    private String message; 

    public void setMessage(final String message) { 
     this.message = message; 
    } 

    public String getMessage() { 
     return this.message; 
    } 
} 

lo tanto, su método se reducirá a:

private MyMessage(String message) { 
    MyMessage myMessage = new MyMessage(); 
    myMessage.setMessage(message); 
    return myMessage; 
} 

Otro aspecto de este cambio sería cambiar el código de serialización, para convertir de nuevo a MiMensaje cadena JSON. Jackson hace Java Beans, mapas por defecto, no es necesario crear un ejemplo JSONObject,

private String serializeMessage(MyMessage message){ 

    //Note: you probably want to put it in a global converter and share the object mapper 
    ObjectMapper mapper = new ObjectMapper(); 
    return mapper.writeValueAsString(message); 
} 

El anterior devolverá {message: "some message"}

He omitido las excepciones por razones de brevedad.

+0

Con todos los rumores sobre jackson, esperaba que org.codehaus.jackson fuera más simple que org.json. Vota por tu ayuda. – kasavbere

+0

Como se mencionó anteriormente, hay un equivalente sin embargo: o bien 'JsonNode' (tipo base) o' ObjectNode' (como subtipo JSON Object específico). Y a diferencia de org.json, hay herencia de nodos para un acceso correcto a OO. – StaxMan

1

Si desea actualizar de la biblioteca org.json al Jackson pieza por pieza, y conservando inicialmente la misma API, es posible que desee leer "Upgrade from org.json to Jackson". Esto al menos haría que su código sea aproximadamente 3 veces más rápido para lectura y escritura JSON básica; Además, podría, si lo desea, comenzar a convertir el procesamiento, ya que Jackson facilita la conversión entre Árboles y POJO (ObjectMapper.treeToValue(...), valueToTree, convertValue entre POJO, etc., etc.).

Simplemente tenga en cuenta que las herramientas con las que está familiarizado pueden sesgar su pensamiento a ciertos patrones, y mantener la mente abierta puede ayudarlo a encontrar otras aún mejores. En el caso de Jackson (o GSON u otras herramientas Java JSON maduras), realmente debería considerar dónde podría ser útil el enlace de datos adecuado, en lugar de utilizar el modelo de árbol centrado en JSON (que ofrece org.json). Los Modelos de árbol mantienen su pensamiento basado en la estructura JSON, que a veces es útil; pero también podría impedirle ver patrones más naturales que provienen de la definición de la estructura de POJO para reflejar el JSON esperado y que operan directamente en objetos de Java.

Cuestiones relacionadas