2012-09-21 16 views
10

Voglio passare da org.json a org.codehaus.jackson. Come posso convertire il seguente codice Java?Da org.json JSONObject a org.codehaus.jackson

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

Ho lasciato fuori il blocco try-catch per semplicità.

risposta

19

Invece di JSONObject utilizzo di Jackson ObjectMapper e ObjectNode:

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

Questo sarebbe equivalente di Jackson del codice corrente org.json.

Tuttavia, Jackson eccelle davvero nella sua capacità di eseguire mappature complesse tra le classi Java (POJO) e la loro rappresentazione JSON, così come la sua API di streaming che consente di eseguire serializzazioni davvero veloci, almeno se confrontate con Le controparti di org.json.

+0

Quindi 'jacksonObj' sarebbe il mio oggetto di ritorno? – kasavbere

+0

Con tutte le ipotesi su Jackson, speravo che org.codehaus.jackson sarebbe stato più semplice di org.json. Up-vote per il tuo aiuto. – kasavbere

+0

@kasavbere: ho modificato la mia risposta per riflettere meglio la tua domanda originale. Per quanto riguarda la semplicità, non è molto semplice, ma dipende da cosa vuoi fare con esso. Per le serializzazioni più semplici, è più semplice usare 'org.json'.Tuttavia, se si stanno eseguendo serializzazioni di oggetti di grandi dimensioni e si hanno alcune esigenze personalizzate (ad esempio serializzare un campo 'Date' come valore' String'), Jackson è di gran lunga l'opzione migliore, imho. –

5

Non ci sono JSONObject in Jackson api. Anziché restituire un valore JSONObject, è possibile restituire una mappa o un bean Java con la proprietà message che contiene getter e setter.

public class MyMessage { 
    private String message; 

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

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

Così, il metodo sarà ridotto a:

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

Un altro aspetto di questo cambiamento sarebbe cambiare il codice di serializzazione, per convertire MyMessage tornare a stringa JSON. Jackson fa Java Beans, mappe per impostazione predefinita, non è necessario creare un JSONObject esempio,

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); 
} 

È possibile che questo tornerà {message: "some message"}

Ho saltato le eccezioni per brevità.

+0

Con tutte le ipotesi su Jackson, speravo che org.codehaus.jackson sarebbe stato più semplice di org.json. Up-vote per il tuo aiuto. – kasavbere

+0

Come accennato in precedenza, esiste comunque un equivalente: 'JsonNode' (tipo base) o' ObjectNode' (come sottotipo oggetto JSON specifico). E a differenza di org.json, esiste l'ereditarietà del nodo per un accesso OO corretto. – StaxMan

1

Se si desidera eseguire l'aggiornamento da org.json biblioteca per Jackson pezzo per pezzo, e inizialmente mantenendo stessa API, si potrebbe desiderare di leggere "Upgrade from org.json to Jackson". Questo renderebbe almeno il tuo codice circa 3 volte più veloce per la lettura e scrittura JSON di base; Inoltre, se lo desideri, inizia a convertire l'elaborazione, dato che Jackson semplifica la conversione tra Alberi e POJO (ObjectMapper.treeToValue(...), valueToTree, convertValue tra POJO ecc. ecc.).

Ricorda che gli strumenti con cui hai familiarità possono influenzare il tuo pensiero su determinati modelli e mantenere una mente aperta può aiutarti a trovarne di migliori. In caso di Jackson (o GSON o altri strumenti JSON Java maturi), dovresti davvero considerare dove potrebbe essere utile l'associazione dati appropriata, invece di usare il modello ad albero centrato su JSON (che offre org.json). I modelli ad albero mantengono il tuo pensiero radicato nella struttura JSON, che a volte è utile; ma potrebbe anche impedirti di vedere più modelli naturali che derivano dalla definizione della struttura POJO per riflettere il JSON previsto e operare direttamente su oggetti Java.