java - 如何从 https ://randomuser. me/api/读取 android 中的 json 文件

标签 java android json

我在读取从 https://randomuser.me 获得的 json 字符串时遇到问题.这是 json 文件:

{
    "results": [{
        "gender": "male",
        "name": {
            "title": "mr",
            "first": "romain",
            "last": "hoogmoed"
        },
        "location": {
            "street": "1861 jan pieterszoon coenstraat",
            "city": "maasdriel",
            "state": "zeeland",
            "postcode": 69217
        },
        "email": "romain.hoogmoed@example.com",
        "login": {
            "username": "lazyduck408",
            "password": "jokers",
            "salt": "UGtRFz4N",
            "md5": "6d83a8c084731ee73eb5f9398b923183",
            "sha1": "cb21097d8c430f2716538e365447910d90476f6e",
            "sha256": "5a9b09c86195b8d8b01ee219d7d9794e2abb6641a2351850c49c309f1fc204a0"
        },
        "dob": "1983-07-14 07:29:45",
        "registered": "2010-09-24 02:10:42",
        "phone": "(656)-976-4980",
        "cell": "(065)-247-9303",
        "id": {
            "name": "BSN",
            "value": "04242023"
        },
        "picture": {
            "large": "https://randomuser.me/api/portraits/men/83.jpg",
            "medium": "https://randomuser.me/api/portraits/med/men/83.jpg",
            "thumbnail": "https://randomuser.me/api/portraits/thumb/men/83.jpg"
        },
        "nat": "NL"
    }],
    "info": {
        "seed": "2da87e9305069f1d",
        "results": 1,
        "page": 1,
        "version": "1.1"
    }
}

我的代码如下:

public class MainActivity extends AppCompatActivity {

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

        ((Button) findViewById(R.id.start_button)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new WebServiceHandler().execute("https://randomuser.me/api/");
                //.execute("http://damianchodorek.com/wsexample/");
                //.execute("https://randomuser.me/api/?results=5&inc=name,email,picture");
            }
        });
    }

    private class WebServiceHandler extends AsyncTask<String, Void, String>{

        // okienko dialogowe, które każe użytkownikowi czekać
        private ProgressDialog dialog = new ProgressDialog(MainActivity.this);

        // metoda wykonywana jest zaraz przed główną operacją (doInBackground())
        // mamy w niej dostęp do elementów UI
        @Override
        protected void onPreExecute() {
            // wyświetlamy okienko dialogowe każące czekać
            dialog.setMessage("Czekaj...");
            dialog.show();
        }

        // główna operacja, która wykona się w osobnym wątku
        // nie ma w niej dostępu do elementów UI
        @Override
        protected String doInBackground(String... urls) {

            try {
                // zakładamy, że jest tylko jeden URL
                URL url = new URL(urls[0]);
                URLConnection connection = url.openConnection();

                // pobranie danych do InputStream
                InputStream in = new BufferedInputStream(connection.getInputStream());

                // konwersja InputStream na String
                // wynik będzie przekazany do metody onPostExecute()
                return streamToString(in);

            } catch (Exception e) {
                // obsłuż wyjątek
                Log.d(MainActivity.class.getSimpleName(), e.toString());
                return null;
            }
        }

        // metoda wykonuje się po zakończeniu metody głównej,
        // której wynik będzie przekazany;
        // w tej metodzie mamy dostęp do UI
        @Override
        protected void onPostExecute(String result) {
            //Toast.makeText(getApplicationContext(),result,Toast.LENGTH_LONG).show();
            // chowamy okno dialogowe
            dialog.dismiss();

            try {
                //Toast.makeText(getApplicationContext(),result,Toast.LENGTH_LONG).show();
                // reprezentacja obiektu JSON w Javie
                JSONObject json = new JSONObject(result);

                // pobranie pól obiektu JSON i wyświetlenie ich na ekranie
                ((TextView) findViewById(R.id.response_id)).setText("title: "
                        + json.optString("title"));
                ((TextView) findViewById(R.id.response_name)).setText("first: "
                        + json.optString("first"));

            } catch (Exception e) {
                // obsłuż wyjątek
                Log.d(MainActivity.class.getSimpleName(), e.toString());
            }
        }
    }

    // konwersja z InputStream do String
    public static String streamToString(InputStream is) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder stringBuilder = new StringBuilder();
        String line = null;

        try {
            while ((line = reader.readLine()) != null) {
                stringBuilder.append(line + "\n");
            }
        }
        reader.close();

        } catch (IOException e) {
            // obsłuż wyjątek
            Log.d(MainActivity.class.getSimpleName(), e.toString());
        }
        return stringBuilder.toString();
    }
}

据我了解,问题出在 json 文件压缩和我的请求之间:

((TextView) findViewById(R.id.response_id)).setText(
        "title: " + json.optString("title"));

因为如果我在 optString() 方法中更改 "results" 上的 "title" 它通常会打印 中的所有内容>“结果” json 中的字段。 我应该在 optString() 方法中写什么来仅从 "title" 字段获取值?

最佳答案

像这样的东西应该可以工作。您的 json 文档不是简单的“字段结构”,因此需要使用特定于类型的 getter 函数。

jsonObj.getJSONArray("results")
  .getJSONObject(0)
  .getJSONObject("name")
  .optString("title")

关于java - 如何从 https ://randomuser. me/api/读取 android 中的 json 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45690542/

相关文章:

android - 如何将一项 Activity 的输入转移到另一项 Activity ?

jquery - 使用 jQuery 加载 JSON 时 IE9 的行为非常奇怪

jquery - REST 上传到 SharePoint 2013 在线文档库后获取项目 ID

java - 直接从 JComponent 重写paintComponent

java - Android 谷歌地图定位权限

java - 我如何监控另一个应用程序的数据库变化?

java - 从 EditText 读取行并将字符串添加到 ArrayList

ruby - 如何使用 ruby​​ 遍历这个 json 文档?

java - 在 PreferencesActivity 中选择 CheckBoxPreference 时不勾选

java - Java (Android) 中从 float 到 char[] 的转换