0

常に存在することが保証されている唯一のものは、messagesByDate obj です。「2012 年 5 月 15 日」などの名前の配列とオブジェクトは、その日付のメッセージが存在するかどうかに基づいて、サーバー (コントロールなし) によって生成されます。

表示される最初の日付が配列であることに気付いた場合、他の日付は番号が付けられた他のオブジェクトを含むオブジェクトです。

質問 1: どの日付が存在するかを知らずにこれを解析するにはどうすればよいですか?

質問 2: 一部のメッセージは、オブジェクトではなく配列になっています。それらをすべて 1 つの 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"
     }
     }
   }
}

答えはちょっと

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 内のすべてのメッセージが得られ、それを「messages」という名前の ArrayList に追加しますが、日付順ではありません。jsonは日付順にリストされています...jsonの読み取りを指示する方法があるかどうか知っている人はいますか? または、WHILE および FOR ループの順序が間違っていますか? ハッシュマップをキーでソートできますか? 私はそれをグーグルします...

4

2 に答える 2

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);
    }
于 2012-05-16T04:03:34.603 に答える
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
    }
}
于 2012-05-16T03:45:03.877 に答える