2013-06-21 58 views
1

我得到一個HttpResponse對象反序列化JSON與不同的對象類型

{ 
"result": "success", 
"team_registration": { 
    "current_status": "executed", 
    "expiration_time": "2012-07-18T21:29:43Z", 
    "id": 609, 
    "team_id": 50, 
    } 
} 

如何retreive的「結果」作爲字符串和「team_registration」作爲一個POJO(在Android設備)與傑克遜以下JSON?

目前我有這樣的:

HttpResponse response = httpClient.execute(httpGet); 
     if (response.getStatusLine().getStatusCode() == 200) { 
      HttpEntity entity = response.getEntity(); 

      String json = EntityUtils.toString(entity); 

      Map<String, Object> map = mapper.readValue(json, new TypeReference<Map<String, Object>>() { 
      }); 

      result = (String) map.get("result"); 
      resultRegistration = (Registration) map.get("team_registration"); 

註冊類:

package be.radarwerk.app.model; 

import java.io.Serializable; 
import java.util.Date; 

import org.codehaus.jackson.annotate.JsonIgnore; 

public class Registration implements Serializable { // Todo implements parceable? 
private static final long serialVersionUID = 1L; 

private int id; 
private String currentStatus; 
private Date expirationTime; 

@JsonIgnore 
private Volunteer volunteer; 
@JsonIgnore 
private Team team; 

public Registration() { 

} 

public Registration(int id, String currentStatus, Volunteer volunteer, 
     Team team) { 
    super(); 
    this.id = id; 
    this.currentStatus = currentStatus; 
    this.volunteer = volunteer; 
    this.team = team; 
} 

public int getId() { 
    return id; 
} 

public String getCurrentStatus() { 
    return currentStatus; 
} 

public Volunteer getVolunteer() { 
    return volunteer; 
} 

public Team getTeam() { 
    return team; 
} 

public Date getExpirationTime() { 
    return expirationTime; 
    } 


} 

「結果」 的字符串工作正常,但對於 「registration_moment」 我得到這個異常: java.lang.ClassCastException :java.util.LinkedHashMap不能轉換爲註冊

我也嘗試將它轉換爲一個字符串以「結果」相同的方式並做mapp該字符串上的er.readValue。 沒有成功。

任何提示?

+0

顯示你'Registration'類的代碼,請。另外,不同類型的「結果」之間是否有共同的對象? – fge

+0

您可能想試試android-query(http://code.google.com/p/android-query/wiki/AsyncAPI) –

回答

1

你的類,如果你修改它像這樣應該會自動反序列化(注傑克遜2.1+需要!):

@JsonIgnoreProperties("team_id") 
@JsonNamingStrategy(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy) 
public class Registration implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 

    private int id; 
    private String currentStatus; 
    private Date expirationTime; 

    @JsonIgnore 
    private Volunteer volunteer; 
    @JsonIgnore 
    private Team team; 

    public Registration() {   
    } 

    // other code 
} 

然後,在你的代碼進行反序列化:

Registration registration; 
final JsonNode node = mapper.readTree(json); 
if (node.get("result").textValue().equals("success")) 
    registration = mapper.readObject(node.get("team_registration").traverse(), 
     Registration.class); 
+0

感謝您的快速回答!是否真的有必要創建這兩個子類?結果:succes只是用來檢查用戶是否登錄並且輸入是否正確(響應是掃描QR碼的結果)。在'SuccessfulOperation'中序列化「註冊」給我的聽起來很奇怪 – Charlie

+0

嗯,不,這不是必要的。這只是我在處理「多態JSON」時知道的最乾淨的解決方案;)你仍然沒有顯示你的'Registration'類是什麼樣的。 – fge

+0

對不起,我現在將其添加爲編輯 – Charlie

1

你對我來說似乎有點奇怪。你應該真的在使用Android JSONObject類,這就是它的目的。一旦你有了一個JSONObject(或者JSONArray),如果你想將元素移動到不同的數據結構中,你將需要迭代它,但這很可能是不必要的。

在任何情況下,這裏的(使用android-query)一些代碼來讓你一個JSONObject:

String url = "whatever you want"; 
aq.ajax(url, JSONArray.class, new AjaxCallback<JSONArray>() { 
    @Override 
    public void callback(String url, JSONArray json, AjaxStatus status) { 
     if (json == null) { 
      Toast.makeText(context, "Failed to retrieve JSON", Toast.LENGTH_SHORT); 
     } 
     else { 
      try { 
       JSONObject general = json.getJSONObject(0); 
       ... 
      } 
     } 
    } 
}); 
+0

我真的很喜歡Android開發。你是否建議在之後將JSONObject序列化爲'Registration'對象? – Charlie