0

オンラインのチュートリアルに従い、コードの一部を微調整しました。アプリケーションが別の場所から情報を読み取れるようにしたいと考えています。現在、アプリはhereからデータを正しく読み取っています。ここからデータを読みたいと思います。Observation Time、Temp_C、および Visibility を達成しようとしています。このデータを読み取るには、try { ブラケット内のコードを変更する必要があると思いますか? 助言がありますか?

public class MainActivity extends ListActivity {

// url to make request
private static String url = "http://api.androidhive.info/contacts/";

// JSON Node names
private static final String TAG_DATA = "contacts";
private static final String TAG_OBSERV = "name";
private static final String TAG_TEMP = "email";
private static final String TAG_VISIB = "gender";

// contacts JSONArray
JSONArray contacts = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Hashmap for ListView
    ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();

    // Creating JSON Parser instance
    JSONParse jParser = new JSONParse();

    // getting JSON string from URL
    JSONObject json = jParser.getJSONFromUrl(url);

    try {
        // Getting Array of Contacts
        contacts = json.getJSONArray(TAG_DATA);

        // looping through All Contacts
        for(int i = 0; i < contacts.length(); i++){
            JSONObject c = contacts.getJSONObject(i);

            // Storing each json item in variable
            String name = c.getString(TAG_OBSERV);
            String email = c.getString(TAG_TEMP);
            String gender = c.getString(TAG_VISIB);

            // creating new HashMap
            HashMap<String, String> map = new HashMap<String, String>();

            // adding each child node to HashMap key => value
            map.put(TAG_OBSERV, name);
            map.put(TAG_TEMP, email);
            map.put(TAG_VISIB, gender);

            // adding HashList to ArrayList
            contactList.add(map);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }

    // Updating parsed JSON data into ListView
    ListAdapter adapter = new SimpleAdapter(this, contactList,
            R.layout.list_item,
            new String[] { TAG_OBSERV, TAG_TEMP, TAG_VISIB }, new int[] {
                    R.id.name, R.id.email, R.id.mobile });

    setListAdapter(adapter);

    // selecting single ListView item
    ListView lv = getListView();

    // Launching new screen on Selecting Single ListItem
    lv.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            // getting values from selected ListItem
            String name = ((TextView) view.findViewById(R.id.name)).getText().toString();
            String cost = ((TextView) view.findViewById(R.id.email)).getText().toString();
            String description = ((TextView) view.findViewById(R.id.mobile)).getText().toString();

            // Starting new intent
            Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);
            in.putExtra(TAG_OBSERV, name);
            in.putExtra(TAG_TEMP, cost);
            in.putExtra(TAG_VISIB, description);
            startActivity(in);
        }
    });
}

}

4

3 に答える 3

0

JSONデータをAndroidに解析する方法は?

したがって、最初に、ネットワーク接続(JSONからデータをフェッチする)を実行しようとしているコードをバックグラウンドスレッドに移動する必要があります。実際、あなたはMain(UI)スレッドでそれを行っていますが、それはあまり良くなく、正しくありません。あなたのアプリがAndroid3.0+で動作するデバイスにインストールされる場合、あなたはそれを手に入れるでしょうNetworkOnMainThreadException、そしてそれは良くありませんね?

次に、JSONを保存し、その構造をよりよく確認するためにいくつかのフォーマットを作成します。マルチセットブラケット{はJSONObjectを示し、ブラケット[はJSONArrayを示します。

これで、JSONを解析できるようになります。今、私はあなたに開始する方法のコードの小さなスニペットを書きます:

JSONObject o = new JSONObject(sourceString);
if (o != null) {
   JSONObject data = o.getJSONObject("data"); // getting JSONObject with key data
   if (data != null) {
      JSONArray current = data.getJSONArray("current_condition");
   }
}
...
于 2013-03-18T18:35:10.593 に答える
0

最も簡単で美しい方法は、必要なプロパティを持つ DTO を作成し、JacksonGsonなどのライブラリを使用して JSON をオブジェクトにマップすることです。その場合、その「手動解析」ではなく、2 行のコードになります。

于 2013-03-18T18:32:15.463 に答える
0

その json から値を解析して取得する方法は次のとおりです。

JSONObject mMainObject = new JSONObject(myResponseString);
if(mMainObject != null){
    JSONObject data = mMainObject.getJSONObject("data");
    if(data != null){
        JSONArray currentCondition = data.getJSONArray("current_condition");
        if(currentCondition != null){
            for(int i = 0; i < currentCondition.lenght(); i++){
                JSONObject obj = currentCondition.get(i);
                if(obj != null){
                    String observation_time = obj.getString("observation_time");
                    String temp_C = obj.getString("temp_C");
                    String visibility = obj.getString("visibility");
                }
            }
        }
    }
}

AsyncTaskたとえば、インターネットからデータをダウンロードする適切な方法を検討する必要があります。このようにして、UI をブロックせず、アプリの応答性が向上します。

この助けを願っています!: )

于 2013-03-18T18:28:08.573 に答える