将Java复杂对象转换为Json

时间:2011-11-30 19:45:08

标签: java android 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;
}

所以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的新手,需要帮助。 在此先感谢您的帮助!

4 个答案:

答案 0 :(得分:16)

使用Google的GSON库非常容易。以下是一个使用示例:

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/

答案 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变量。

这一开始有点令人困惑但是一旦你想出来就会节省很多时间。如果有什么不清楚,请告诉我。