2011-11-30 55 views
6

Ho bisogno di convertire la seguente classe:Convertire file Java oggetto complesso a JSON

package comS309.traxz.data; 

import java.util.Collection; 

import org.json.JSONException; 
import org.json.JSONObject; 

public class ExerciseSession { 

    public String DateCreated; 
    public String TotalTime; 
    public String CaloriesBurned; 
    public String AvgSpeed; 
    public String SessionName; 
    public String Distance; 
    public String SessionType; 
    public String UserId; 
    public Collection<LatLon> LatLons; 
} 

Dove LatLon è la seguente:

public class LatLon { 

    public String LatLonId; 
    public String Latitude; 
    public String Longitude; 
    public String ExerciseSessionId; 
    public String LLAveSpeed; 
    public String Distance; 
} 

Quindi la Classe ExerciseSession ha una collezione di oggetti LatLon. Ora ho bisogno di convertire The ExerciseSession Class in un formato Json da java e inviarlo al mio server.

Lo sto facendo sul sistema operativo Android, se questo è importante.

mia soluzione attuale è questa:

JSONObject ExerciseSessionJSOBJ = new JSONObject(); 
ExerciseSessionJSOBJ.put("DateCreated", this.DateCreated); 
      ExerciseSessionJSOBJ.put("TotalTime", this.TotalTime); 
      ExerciseSessionJSOBJ.put("CaloriesBurned", this.CaloriesBurned); 
      ExerciseSessionJSOBJ.put("AvgSpeed", this.AvgSpeed); 
      ExerciseSessionJSOBJ.put("SessionName", this.SessionName); 
      ExerciseSessionJSOBJ.put("Distance", this.Distance); 
      ExerciseSessionJSOBJ.put("SessionType", this.SessionType); 
      ExerciseSessionJSOBJ.put("UserId", this.UserId); 
      //add the collection 
      for(LatLon l: LatLons) 
      { 
       ExerciseSessionJSOBJ.accumulate("LatLons", l); 
      } 

io non sono sicuro che questo è valido .. io sono un novizio con JSON e bisogno di aiuto. Grazie in anticipo per l'aiuto!

risposta

16

Questo è molto facile da fare utilizzando la libreria GSON di Google. Ecco un esempio di utilizzo:

Gson gson = new Gson(); 
String jsonRepresentation = gson.toJson(myComplexObject); 

E per ottenere l'oggetto indietro:

Gson gson = new Gson(); 
MyComplexObject myComplexObject = gson.fromJson(jsonRepresentation, MyComplexObject.class); 

http://code.google.com/p/google-gson/

+0

Questo è perfetto, grazie! – Aziz

+0

Ciao binnyb, m conversione di oggetti complessi in JSON usando la risposta che hai fornito. Ma ho alcune eccezioni di runtime come 'java.lang.StackOverflowError: stack size 8MB' e' android.os.TransactionTooLargeException' Puoi aiutarmi a –

+0

@OnkarNene stai passando troppi dati, la cosa migliore è puntare a esplorare la causa di questo errore e cercare di ridurre l'occorrenza di blocchi di dati così grandi, vedere questo post: http://stackoverflow.com/questions/11451393/che cosa-to-do-on-transactiontoolargeexception – binnyb

2

È inoltre possibile serializzare l'oggetto utilizzando flexjson: http://flexjson.sourceforge.net/

+0

o GSON (io l'ho buone esperienze in questo) o Jackson (non ho così buono esperienze con questo) – schlingel

+0

Gson è anche un'opzione valida sì ... :) –

1

Vorrei davvero suggerire di evitare l'utilizzo di JSONObject per la conversione tra stringhe e oggetti Java. Probabilmente reclami la tua sanità mentale se devi farne troppa. In alternativa, sono un grande fan di Jackson, che fa ciò che descrivi in ​​un modo davvero piacevole e semplice.

Come esempio di base,

public static class LatLon { 

    public final String LatLonId; 
    public final String Latitude; 
    public final String Longitude; 
    public final String ExerciseSessionId; 
    public final String LLAveSpeed; 
    public final String Distance; 

    @JsonCreator 
    public LatLon(@JsonProperty("distance") String distance, 
        @JsonProperty("exerciseSessionId") String exerciseSessionId, 
        @JsonProperty("latitude") String latitude, 
        @JsonProperty("latLonId") String latLonId, 
        @JsonProperty("LLAveSpeed") String LLAveSpeed, 
        @JsonProperty("longitude") String longitude) { 

     this.Distance = distance; 
     this.ExerciseSessionId = exerciseSessionId; 
     this.Latitude = latitude; 
     this.LatLonId = latLonId; 
     this.LLAveSpeed = LLAveSpeed; 
     this.Longitude = longitude; 
    } 

    public static void something() { 
     ObjectMapper mapper = new ObjectMapper(); 
     String json = "{\"LLAveSpeed\":\"123\",\"Distance\":\"123\"," 
+ "\"ExerciseSessionId\":\"123\",\"LatLonId\":\"123\"," 
+ "\"Latitude\":\"123\",\"Longitude\":\"123\"}"; 

     try { 
      //turn the json string into a LatLon object. 
      LatLon latLon = mapper.readValue(json, LatLon.class); 
      //turn the latLon object into a new JSON string 
      String newJson = mapper.writeValueAsString(latLon); 
      //confirm that the strings are equal 
      Log.w("JacksonDemo", "Are they equal? " + json.equals(newJson)); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Questo uscite Are they equal? true.

Quindi si utilizza readValue() per convertire json in un oggetto Java, writeValueAsString() per scrivere nuovamente un oggetto in json. @JsonCreator indica il costruttore che Jackson dovrebbe utilizzare per convertire betwee json e Java. @JsonProperty("jsonKeyName") contrassegna il nome di una variabile nella stringa json e la variabile Java a cui deve corrispondere.

Questo è un po 'di confusione all'inizio, ma consente di risparmiare un sacco di tempo una volta capito. Fammi sapere se qualcosa non è chiaro.

+0

mio Dio, sono contento di non usare Jackson. per qualcosa di semplice come la domanda posta, GSON sembra essere la vittoria.Non so nulla di Jackson, ma questa implementazione mi sembra troppo impegnativa e troppo complicata. – binnyb

+3

Il motivo per cui il mio esempio è più complicato dei metodi di GSON toJson/fromJson è che su Android molte app superano una fase di offuscamento prima di essere rilasciate sul mercato. Ciò significa che non puoi dipendere dal fatto che i nomi delle variabili rimangano uguali alle loro controparti JSON. Di conseguenza, devi annotare con '@ JsonProperty' e specificare i campi. Puoi rimuovere tutte le annotazioni e avere ancora Jackson in funzione, ma né Jackson né GSON funzioneranno dopo l'offuscamento a meno che non vengano trasmesse informazioni di mappatura variabili. – plowman

Problemi correlati