2011-11-30 21 views
6

Necesito convertir la siguiente clase:Conversor de Java objeto complejo 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; 
} 

Dónde LatLon es el siguiente:

public class LatLon { 

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

Así que la ExerciseSession clase tiene una colección de objetos LatLon. Ahora necesito convertir The ExerciseSession Class en un formato Json de Java y enviarlo a mi servidor.

Estoy haciendo esto en el sistema operativo Android, si eso importa.

Mi solución actual es la siguiente:

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

No estoy seguro de que esto es válido .. Soy un novato con JSON y necesito ayuda. ¡Gracias de antemano por la ayuda!

Respuesta

16

Esto es muy fácil de hacer usando la biblioteca GSON de Google. He aquí un ejemplo de uso:

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

Y para conseguir el objeto de nuevo:

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

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

+0

Esto es astuto, ¡gracias! – Aziz

+0

Hola binnyb, m convertir objeto complejo en JSON usando la respuesta que proporcionaste. Pero tengo algunas Excepciones de tiempo de ejecución como 'java.lang.StackOverflowError: stack size 8MB' y' android.os.TransactionTooLargeException' Me pueden ayudar –

+0

@OnkarNene están pasando demasiados datos, lo mejor es apostar por explore la causa de este error y trate de reducir la ocurrencia de grandes cantidades de datos, consulte esta publicación: http://stackoverflow.com/questions/11451393/what-to-do-on-transactiontoolargeexception – binnyb

2

También puede serializar el objeto utilizando Flexjson: http://flexjson.sourceforge.net/

+0

o GSON (i tener buenas experiencias con eso) o Jackson (no tengo tan buena experiencias con eso) – schlingel

+0

Gson también es una opción viable, sí ... :) –

1

Sugiero que evite el uso de JSONObject para convertir entre cadenas y objetos Java. Probablemente reclamará tu cordura si tienes que hacer demasiado. Como alternativa, soy un gran admirador de Jackson, que hace lo que describes de una manera realmente agradable y sencilla.

Como ejemplo básico,

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

Este salidas Are they equal? true.

Así que usa readValue() para convertir json en un objeto Java, writeValueAsString() para escribir un objeto en json. @JsonCreator marca el constructor que Jackson debería usar para convertir entre json y Java. @JsonProperty("jsonKeyName") marca el nombre de una variable en la cadena json y la variable Java a la que debe asignarse.

Esto es un poco confuso al principio, pero ahorra mucho tiempo una vez que lo resuelves. Avíseme si algo no está claro.

+0

mi bondad, me alegro de que no uso Jackson. para algo simple como la pregunta, GSON parece ser el ganador.No sé nada sobre Jackson, pero esta implementación parece demasiado trabajo y demasiado complicada. – binnyb

+3

La razón por la que mi ejemplo es más complicado que los métodos de GSON toJson/fromJson es que en Android, muchas aplicaciones pasan por un paso de ofuscación antes de lanzarse al mercado. Esto significa que no puede depender de que los nombres de las variables sean los mismos que sus contrapartes JSON. Como resultado, debe anotar con '@ JsonProperty' y especificar campos. Puede eliminar todas las anotaciones y aún así tener el trabajo de Jackson, pero ni Jackson ni GSON funcionarán después de la ofuscación a menos que usted transmita información de mapeo variable. – plowman