Преобразование Java-комплексного объекта в 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; } 

Где LatLon выглядит следующим образом:

 public class LatLon { public String LatLonId; public String Latitude; public String Longitude; public String ExerciseSessionId; public String LLAveSpeed; public String Distance; } 

Таким образом, у класса ExerciseSession есть коллекция объектов LatLon. Теперь мне нужно преобразовать класс ExerciseSession в Json-формат из java и отправить его на мой сервер.

Я делаю это на ОС Android, если это имеет значение.

Мое текущее решение таково:

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

Я не уверен, что это действительно. Я новичок в Json и нуждаюсь в помощи. Заранее спасибо за помощь!

Solutions Collecting From Web of "Преобразование Java-комплексного объекта в Json"

Это очень легко сделать с помощью библиотеки GSON от Google. Вот пример использования:

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

И вернуть объект обратно:

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

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

Вы также можете сериализовать объект с помощью flexjson: http://flexjson.sourceforge.net/

Я думаю, что использование аккумулирования правильное. См .: http://www.json.org/javadoc/org/json/JSONObject.html#accumulate(java.lang.String,%20java.lang.Object )

Но вам нужно создать JSONObject для каждого LatLon, как и для объекта ExerciseSession. Тогда следующая строка неверна: ExerciseSessionJSOBJ.accumulate («LatLons», l);

«L» необходимо преобразовать.

Я бы действительно предложил вам избежать использования JSONObject для преобразования между строками и объектами Java. Вероятно, это потребует вашего здравомыслия, если вам нужно сделать слишком много. В качестве альтернативы я большой поклонник Джексона , который делает то, что вы описываете, действительно приятным и простым способом.

В качестве основного примера,

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

Эти результаты Are they equal? true Are they equal? true .

Таким образом, вы используете readValue() для преобразования json в объект Java, writeValueAsString() для записи объекта обратно в json. @JsonCreator отмечает конструктора, которым Джексон должен использовать для преобразования betwee json и Java. @JsonProperty("jsonKeyName") обозначает имя переменной в json-строке и переменную Java, на которую она должна отображаться.

Это немного запутывает сначала, но экономит много времени, как только вы это выясните. Дайте мне знать, если что-то неясно.