2012-05-16 17 views
0

Единственное, что всегда гарантировано, это messageByDate obj. Массив и объекты, названные так «15 МАЯ 2012», генерируются сервером (без контроля), основанным на сообщениях или нет, для этой даты.Android: как разобрать этот смешанный ответ json

Если вы заметили, что первая представленная дата представляет собой массив, а другие даты - объекты, содержащие другие объекты, которые были пронумерованы.

ВОПРОС 1: как разобрать это, не зная, какие даты будут присутствовать?

ВОПРОС 2: Некоторые сообщения находятся в массиве вместо объекта. как мне собрать все вместе в один ArrayList. Скорее это в массиве или нет, потому что массив не всегда будет там.

Пожалуйста, любая помощь будет оценена, как я до моих последних волос

Спасибо.

{ 
"messagesByDate":{ 
    "15 May 2012":[ 
    { 
     "id":"1383483367", 
     "conversation_id":"274618561", 
     "user_id":"4318264", 
     "message":"ok will do", 
     "date_sent":"1337133515", 
     "date_sent_ago":"7 mins ago" 
    }, 
    { 
     "id":"1380222533", 
     "conversation_id":"274618561", 
     "user_id":"5159567", 
     "message":"ok well hmu", 
     "date_sent":"1337085122", 
     "date_sent_ago":"13 hrs ago" 
    }, 
    { 
     "id":"1380172978", 
     "conversation_id":"274618561", 
     "user_id":"5159567", 
     "message":"superhead", 
     "date_sent":"1337083910", 
     "date_sent_ago":"13 hrs ago" 
    }, 
    { 
     "id":"1380130860", 
     "conversation_id":"274618561", 
     "user_id":"5159567", 
     "message":"you ready B", 
     "date_sent":"1337082797", 
     "date_sent_ago":"14 hrs ago" 
    }, 
    { 
     "id":"1378841432", 
     "conversation_id":"274618561", 
     "user_id":"5159567", 
     "message":"hit my cell tho", 
     "date_sent":"1337054524", 
     "date_sent_ago":"22 hrs ago" 
    }, 
    { 
     "id":"1378836763", 
     "conversation_id":"274618561", 
     "user_id":"5159567", 
     "message":"whats up baby", 
     "date_sent":"1337054475", 
     "date_sent_ago":"22 hrs ago" 
    } 
    ], 
    "12 May 2012":{ 
    "6":{ 
     "id":"1362948558", 
     "conversation_id":"274618561", 
     "user_id":"4318264", 
     "message":"ok ima text u", 
     "date_sent":"1336819668", 
     "date_sent_ago":"3 days ago" 
    } 
    }, 
    "11 May 2012":{ 
    "7":{ 
     "id":"1361356267", 
     "conversation_id":"274618561", 
     "user_id":"5159567", 
     "message":"yea thats cool", 
     "date_sent":"1336790738", 
     "date_sent_ago":"3 days ago" 
    }, 
    "8":{ 
     "id":"1357783913", 
     "conversation_id":"274618561", 
     "user_id":"5159567", 
     "message":"sorry im here. would u like to exchange numebers instead?", 
     "date_sent":"1336722533", 
     "date_sent_ago":"4 days ago" 
    }, 
    "9":{ 
     "id":"1357759262", 
     "conversation_id":"274618561", 
     "user_id":"5159567", 
     "message":"hello?", 
     "date_sent":"1336721851", 
     "date_sent_ago":"4 days ago" 
    } 
    } 
    } 
} 

ОТВЕТ SORTA-Любопытное

JSONObject dateHolder = r.getJSONObject("messagesByDate"); 
    Iterator holderItr = dateHolder.keys(); 


    while(holderItr.hasNext()){ 


     String thisdate = holderItr.next().toString(); 
     Object date = dateHolder.get(thisdate); 


     if (date instanceof JSONArray) { 
      System.out.println(thisdate+" is an ARRAY."); 
      JSONArray jarray = (JSONArray) date; 
      for(int x=0;x<jarray.length();x++){ 
       String msgId = jarray.getJSONObject(x).getString("id"); 
       String msgConvoId = jarray.getJSONObject(x).getString("conversation_id"); 
       String msgUserId = jarray.getJSONObject(x).getString("user_id"); 
       String msgBody = jarray.getJSONObject(x).getString("message"); 
       String msgDateSent = jarray.getJSONObject(x).getString("date_sent"); 
       String msgDateSentAgo = jarray.getJSONObject(x).getString("date_sent_ago"); 
       HashMap<String,String> temp = new HashMap<String,String>(); 
       temp.put("msgId",msgId); 
       temp.put("msgUserId", msgUserId); 
       temp.put("msgBody", msgBody); 
       temp.put("msgDateSent", msgDateSent); 
       temp.put("msgDateSentAgo", msgDateSentAgo); 
       messages.add(temp); 

      } 
     } else { 
      System.out.println(thisdate+" is an OBJECT."); 
      JSONObject jobj = (JSONObject) date; 
      Iterator insideDate = jobj.keys(); 
      while(insideDate.hasNext()){ 
       String number = insideDate.next().toString(); 
       System.out.println(number); 
       String msgId = jobj.getJSONObject(number).getString("id"); 
       String msgConvoId = jobj.getJSONObject(number).getString("conversation_id"); 

       String msgUserId =jobj.getJSONObject(number).getString("user_id"); 

       String msgBody = jobj.getJSONObject(number).getString("message"); 

       String msgDateSent = jobj.getJSONObject(number).getString("date_sent"); 

       String msgDateSentAgo = jobj.getJSONObject(number).getString("date_sent_ago"); 
       HashMap<String,String> temp = new HashMap<String,String>(); 
       temp.put("msgId",msgId); 
       temp.put("msgUserId", msgUserId); 
       temp.put("msgBody", msgBody); 
       temp.put("msgDateSent", msgDateSent); 
       temp.put("msgDateSentAgo", msgDateSentAgo); 
       messages.add(temp); 

      } 
     } 
    } 

Это дает мне все сообщения в HashMap и добавляет его к ArrayList называют сообщения, как я хочу, но не в порядке по дате. json указан по дате ... кто-нибудь знает, есть ли способ направить json-чтение? ИЛИ мои петли WHILE и FOR вышли из строя? Могу ли я сортировать хэш-карты с помощью ключа? Я Google, что ...

ответ

0
JSONObject json = service.getJunk(); 
JSONObject msgJson = json.getJSONObject("messagesByDate"); 
for(Iterator it = msgJson.keys(); it.hasNext();) { 
    Object obj = msgJson.get((String)it.next()); 
    if(obj instanceof JSONObject) { 
     JSONObject jobj = (JSONObject)obj; 
     // process json object 
    } else { 
     JSONArray arry = (JSONArray)obj; 
     // process array 
    } 
} 
+0

Eclipse сообщает мне, что оператор for должен использовать переменную или экземпляр iterable для msgJson.keys() – TonyCruze

+0

Это довольно легко преобразовать, чтобы использовать итерацию старого стиля в Java. На этот раз я обновил код. Имейте в виду, я просто делаю это с головы. Я не тестирую его, так что тривиальные синтаксические изменения, как это, читатель должен делать самостоятельно. – chubbsondubs

+0

Да, я начал играть с Iterator next() и hasNext() вчера вечером вместо заявления FOR и получил довольно близко. но не два вместе, поэтому я попробую это. Я думаю, что важная часть, которую я отсутствовала, - просто проверить, является ли это «экземпляром». Im goin, чтобы посмотреть и проверить этот пример и посмотреть, смогу ли я заставить его работать. Огромное спасибо. – TonyCruze

1

Сначала нужно создать класс вроде этого:

import java.util.LinkedList; 
import android.util.Log; 

public class Message{ 

    private LinkedList<String> id    = new LinkedList<String>(); 
    private LinkedList<String> conversation_id = new LinkedList<String>(); 
    private LinkedList<String> user_id  = new LinkedList<String>(); 
    private LinkedList<String> message  = new LinkedList<String>(); 
    private LinkedList<String> date_sent  = new LinkedList<String>(); 
    private LinkedList<String> date_sent_ago = new LinkedList<String>(); 

    public LinkedList<String> getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id.add(id); 
    } 

. 
. 
. 
    // For checking response after you get info from server 
    public void printContent() { 
     for(String str : id) 
      Log.i("Id>>>", str); 
. 
. 
. 
    } 

} 

Затем нужно вызвать сервер в OnCreate() добавьте этот код:

if(Manager.isOnline(this)) // Check Internet connection and if you find it then 
      new MyAsyncTask().execute(); 

Теперь вы должны добавить этот класс:

public class MyAsyncTask extends AsyncTask<Void, Void, Boolean> { 

     @Override 
     protected void onPreExecute() { 
      Log.i(TAG, "MyAsyncTask is about to start..."); 
      showProgressBar(); 
     } 


     @Override 
     protected Boolean doInBackground(Void... params) { 
      boolean status = false; 

      // Get News items in json format 
      msg = getMessageItems(); // msg is an instance of Message class define it as global variable. 
      msg.printContent(); // Check result in logcat 

      if(msg != null) 
       status = true; 

      return status; 
     } 


     @Override 
     protected void onPostExecute(Boolean result) { 
      Log.i(TAG, "MyAsyncTask finished its task. Data returned to caller."); 

      if(result) 
       displayData(); 

      hideProgressBar(); 
     } 
    } 

Здесь мы подключимся к серверу, получим данные Json и проанализируем его.

private Menu getMenuItems() { 
    Message mMessage = new Message(); 
    String response = null; 
    String connection = **YOUR_URL**; 

    try { 
     URL url = new URL(connection); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

     int responseCode = conn.getResponseCode(); 
     Log.i(TAG, "Try to open: " + connection); 
     Log.i(TAG, "Response code is: " + responseCode); 
     if (responseCode == HttpURLConnection.HTTP_OK) { 
      BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
      if (in != null) { 
       StringBuilder strBuilder = new StringBuilder(); 
       // Read character by character    
       int ch = 0; 
       while ((ch = in.read()) != -1) 
        strBuilder.append((char) ch); 

       // get returned message and show it 
       response = strBuilder.toString(); 
       Log.i("JSON returned by server:", response); 

       JSONObject jObject = new JSONObject(response); 
       JSONArray contestantObjects = jObject.getJSONArray("**messagesByDate**"); 
       for(int i=0; i<contestantObjects.length(); i++){ 
        mMessage .setId(contestantObjects.getJSONObject(i).getString("id").toString()); 
// Repeat this to get all of other items 
       } 
      } 

      in.close(); 

     } else 
      Log.e(TAG, "Couldn't open connection in getMenuItems()"); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    return mMessage; 
} 

Теперь у вас есть объект, каждый из которых является списком. Вы можете делать все, что хотите, в методе отображения. вы можете передать его как объект для адаптера, чтобы показать его данные.

private void displayData() { 
     messageAdapter.setData(msg); 
     listView.setAdapter(messageAdapter); 
    } 

Надеюсь, что этот образец кода поможет вам.

+0

Этот пример ПОСМОТРЕТЬ, чтобы быть в курсе с тем, что я хочу в конце (список данных для адаптера).Но мне понадобится время, чтобы обернуть голову вокруг всех частей этого образца, и я боюсь, что это может вызвать больше проблем, кроме тех, что у вас под рукой. НО Я ДЕЛАЮ DEF, потому что я хотел играть с айктами. Еще раз спасибо. – TonyCruze

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