2012-05-16 21 views
0

唯一保證總是在那裏的是messagesByDate obj。 命名的數組和對象,例如「2012年5月15日」是由服務器(無控制)根據該日期是否存在消息生成的。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-KINDA

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循環失序?我可以通過鑰匙來排序hashmaps嗎?我將谷歌認爲...

回答

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語句必須爲msgJson.keys()使用一個變量或iterable的實例() – TonyCruze

+0

將它轉換爲在Java中使用舊式迭代非常容易。我這次更新了代碼。請記住,我只是在做我的頭頂。我沒有對它進行測試,所以這樣簡單的語法變化是讀者應該能夠自己完成的。 – chubbsondubs

+0

是的,我開始玩Iterator next()和hasNext(),而不是FOR語句,並且非常接近。但不是兩者結合,所以我會嘗試。我認爲我錯過的重要部分是簡單地測試它是否是'instanceof'。我要去看看和測試這個例子,看看我能否得到它的工作。非常感謝你。 – 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

這個示例SEEMS將最終跟蹤我想要的內容(適配器的數據列表)。但是,我需要花一些時間來圍繞這個樣本的所有部分,恐怕除了手頭上的問題外,還會產生更多的問題。但我會DEF嘗試它,因爲我一直想玩asyctasks。再次感謝。 – TonyCruze