2012-04-19 8 views
0

Извините за заголовок, я объясню.Какую коллекцию я должен преобразовать в JSON и снова проанализировать?

Я разрабатываю приложение для Android, использующее WebService для Google App Engine. В моей WebService я ArrayList конвертированы в формат JSON корыта JAX-RS, а окончательный JSON-то вроде

{ "уроки": [{ "имя": "BlaBla", "ПРОФ":» Том»}, { "имя": "блабли", "профессор": "Томь"}]}

является ли это практическое или есть способ лучше?

Затем Принести эту JSON с Android приложения и преобразовать его в JSONObject с snipplet найти на сайте:

DefaultHttpClient defaultClient = новый DefaultHttpClient();

HttpGet httpGetRequest = new HttpGet (s);

HttpResponse httpResponse = defaultClient.execute (httpGetRequest);

BufferedReader reader = new BufferedReader (новый InputStreamReader (httpResponse.getEntity(). GetContent(), "UTF-8"));

Строка json = reader.readLine();

JSONObject jsonObject = новый JSONObject (json);

Как я могу вернуться к списку ArrayList?

Я прочитал тонны кода и пытался использовать Gson ... Это должно быть легко, но я потерял целый день вчера ..

ответ

2
private class Info { 
     public String name; 
     public String prof; 
    } 

    ArrayList<Info> arrayList = new ArrayList<Info>(); 

    JSONArray array = jsonObject.optJSONArray("lessons"); 
    int len = array.length(); 

    for (int i = 0; i < len ; i++) { 
    JSONObject tmp = array.optJSONObject(i); 
    Info info = new Info(); 
    info.name = tmp.optString("name"); 
    info.prof = tmp.optString("prof"); 
     arrayList.add(info) 
} 

проверка mispelling ошибки

+0

Это работает как шарм. Большое спасибо! – Enrichman

0

Если вы хотите, чтобы пойти с встроенной в JSON-классов, вы могли бы сделать что-то вроде этого:

DefaultHttpClient defaultClient = new DefaultHttpClient(); 
HttpGet httpGetRequest = new HttpGet(s); 
HttpResponse httpResponse = defaultClient.execute(httpGetRequest); 
BufferedReader reader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "UTF-8")); 
String json = reader.readLine(); 
JSONObject jsonObject = new JSONObject(json); 
if (jsonObject.has("lessons")) { 
    JSONArray jsonLessons = jsonObject.getJSONArray("lessons"); 
    List<Lesson> lessons = new ArrayList<Lesson>(); 
    for(int i = 0; i < jsonLessons.length(); i++) { 
     JSONObject jsonLesson = jsonLessons.get(i); 
     // Use optString instead of get on the next lines if you're not sure 
     // the fields are always there 
     String name = jsonLesson.getString("name"); 
     String teacher = jsonLesson.getString("prof"); 
     lessons.add(new Lesson(name, teacher)); 
    } 
} 

Просто быть уверены, что ваш Json всегда прибывает в одну строку. Разрыв строки нарушил бы этот код, поскольку вы только читали строку.

Мой выбор был бы Гсеном. В этом случае вы можете создать класс урока и класс Расписания:

public class Lesson { 

    String name; 
    String prof; 

} 

public class Schedule { 

    List<Lesson> lessons; 
} 

Обратите внимание, что имена полей соответствуют полям JSon. Не стесняйтесь делать поля частными и добавлять методы som getter, если это будет лучше. :-)

Теперь вы можете разобрать объект Schedule, содержащим перечень уроков с:

DefaultHttpClient defaultClient = new DefaultHttpClient(); 
HttpGet httpGetRequest = new HttpGet(s); 
HttpResponse httpResponse = defaultClient.execute(httpGetRequest); 
Reader in = new InputStreamReader(httpResponse.getEntity().getContent(), "UTF-8"); 

Gson gson = new Gson(); 
Schedule schedule = gson.fromJson(in, Schedule.class); 
List<Lesson> lessons = schedule.lessons; 

Надеется, что это помогает!

+0

Да, я думал о таком решении, но не работал! Также ваш пример не работает. Проблема в десериализации. Не знаю, где! Мне нравится этот, потому что это просто .. – Enrichman

+0

У вас есть какие-то сведения о том, что происходит не так? Если вы используете proguard, вам необходимо убедиться, что вы не запутываете классы моделей (Schedule and Lesson) – Albin

Смежные вопросы