2013-06-21 3 views
1

я получаю следующее JSON из HttpResponseDeserialize JSON с различными типами объектов

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

Как извлечь на «результат» в виде строки и «team_registration» как POJO (в Android) с Джексоном?

В настоящее время у меня есть это:

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

Возможно, вы захотите попробовать андроид-запрос (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 как объект «Регистрация» впоследствии? – Charlie