2011-11-30 45 views
6

tôi cần phải chuyển đổi các lớp sau:Chuyển đổi Java đối tượng phức tạp để 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; 
} 

đâu LatLon được như sau:

public class LatLon { 

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

Vì vậy, các lớp ExerciseSession có một bộ sưu tập của các đối tượng LatLon. Bây giờ tôi cần phải chuyển đổi Class ExerciseSession thành một định dạng Json từ java và gửi nó đến máy chủ của tôi.

Tôi đang thực hiện việc này trên hệ điều hành Android, nếu có vấn đề.

giải pháp hiện tại của tôi là thế này:

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

Tôi không chắc chắn này là hợp lệ .. Tôi là một người mới làm quen với Json và cần sự giúp đỡ. Cảm ơn trước sự giúp đỡ!

Trả lời

16

Điều này rất dễ thực hiện khi sử dụng thư viện GSON của Google. Dưới đây là một ví dụ sử dụng:

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

Và để có được những đối tượng sau:

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

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

+0

Điều này thật khéo léo, cảm ơn bạn! – Aziz

+0

Xin chào binnyb, m chuyển đổi đối tượng phức tạp thành JSON bằng câu trả lời bạn đã cung cấp. Nhưng tôi có một số ngoại lệ thời gian chạy như 'java.lang.StackOverflowError: kích thước ngăn xếp 8MB' và' android.os.TransactionTooLargeException' Bạn có thể giúp tôi –

+0

@OnkarNene bạn đang truyền tải quá nhiều dữ liệu, bạn đặt cược tốt nhất là khám phá nguyên nhân gây ra lỗi này và cố gắng giảm thiểu sự xuất hiện của các khối dữ liệu lớn như vậy, hãy xem bài đăng này: http://stackoverflow.com/questions/11451393/what-to-do-on-transactiontoolargeexception – binnyb

2

Bạn cũng có thể serialize các đối tượng sử dụng flexjson: http://flexjson.sourceforge.net/

+0

hoặc gson (tôi có kinh nghiệm tốt với điều đó) hoặc jackson (Tôi không có quá tốt kinh nghiệm với điều đó) – schlingel

+0

Gson cũng là một lựa chọn khả thi có ... :) –

1

Tôi thực sự khuyên bạn nên tránh sử dụng JSONObject để chuyển đổi giữa các chuỗi và đối tượng Java. Nó có lẽ sẽ yêu cầu sự tỉnh táo của bạn nếu bạn phải làm quá nhiều. Thay vào đó, tôi là một fan hâm mộ lớn của Jackson, làm những gì bạn mô tả một cách thực sự dễ chịu và đơn giản.

Như một ví dụ cơ bản,

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

này kết quả đầu ra Are they equal? true.

Vì vậy, bạn sử dụng readValue() để chuyển đổi json thành đối tượng Java, writeValueAsString() để viết đối tượng trở lại vào json. @JsonCreator đánh dấu nhà xây dựng Jackson nên sử dụng để chuyển đổi jetw betwee và Java. @JsonProperty("jsonKeyName") đánh dấu tên của một biến trong chuỗi json và biến Java mà nó sẽ ánh xạ tới.

Điều này hơi khó hiểu lúc đầu nhưng tiết kiệm rất nhiều thời gian khi bạn tìm ra. Hãy cho tôi biết nếu có gì không rõ ràng.

+0

lòng tốt của tôi Tôi rất vui vì tôi không sử dụng Jackson. cho một cái gì đó đơn giản như câu hỏi, GSON dường như là chiến thắng.tôi không biết gì về Jackson, nhưng việc thực hiện này có vẻ như quá nhiều công việc và quá phức tạp. – binnyb

+3

Lý do ví dụ của tôi phức tạp hơn so với các phương pháp GSON toJson/fromJson là trên Android, nhiều ứng dụng trải qua một bước obfuscation trước khi được phát hành ra thị trường. Điều này có nghĩa là bạn không thể phụ thuộc vào tên biến còn lại giống như các đối tác JSON của chúng. Kết quả là, bạn phải chú thích với '@ JsonProperty' và chỉ định các trường. Bạn có thể loại bỏ tất cả các chú thích và vẫn còn có Jackson làm việc, nhưng cả Jackson và GSON đều không hoạt động sau khi bị làm mờ trừ khi bạn truyền tải thông tin ánh xạ biến đổi. – plowman

Các vấn đề liên quan