我需要转换以下类:
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;
}
所以Class ExerciseSession有一组LatLon对象。现在我需要将ExerciseSession类从java转换为Json格式并将其发送到我的服务器。
我在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的新手,需要帮助。 在此先感谢您的帮助!
答案 0 :(得分:16)
使用Google的GSON库非常容易。以下是一个使用示例:
Gson gson = new Gson();
String jsonRepresentation = gson.toJson(myComplexObject);
让对象回来:
Gson gson = new Gson();
MyComplexObject myComplexObject = gson.fromJson(jsonRepresentation, MyComplexObject.class);
答案 1 :(得分:2)
您还可以使用flexjson序列化对象:http://flexjson.sourceforge.net/
答案 2 :(得分:1)
我认为使用累积是正确的。见:http://www.json.org/javadoc/org/json/JSONObject.html#accumulate(java.lang.String,%20java.lang.Object)
但是你需要为每个LatLon创建一个JSONObject,就像对ExerciseSession对象一样。 然后,以下行是错误的: ExerciseSessionJSOBJ.accumulate(“LatLons”,l);
“l”必须改变。
答案 3 :(得分:1)
我真的建议你避免使用JSONObject在字符串和Java对象之间进行转换。如果你不得不做太多的话,它可能会声称你的理智。作为替代方案,我是Jackson的忠实粉丝,它以非常愉快和简单的方式完成您所描述的内容。
作为一个基本的例子,
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
。
因此,您使用readValue()
将json转换为Java对象,writeValueAsString()
将对象写回json。 @JsonCreator
标志着杰克逊应该使用的构造函数来转换json和Java。 @JsonProperty("jsonKeyName")
标记json字符串中的变量名称以及它应映射到的Java变量。
这一开始有点令人困惑但是一旦你想出来就会节省很多时间。如果有什么不清楚,请告诉我。