尝试从 URL 加载 JSON 并且不知道如何处理异常

Trying to load JSON from a URL and don't know how to handle Exceptions

我正在尝试从 Android 应用程序中的 URL 加载 JSON(URL 仅链接到 JSON 数据,有没有其他的)。 现在我只是试图将 URL 的内容加载到一个字符串中。

我遇到的问题是我需要处理异常,但我对此不太熟悉。

这是我的相关部分 'Functions' class:

static public String loadURL(String inputURL) throws Exception {

    String fullString = "";
    URL url = new URL(inputURL);
    BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
    String line;
    while ((line = reader.readLine()) != null) {
        fullString += line;
    }
    reader.close();

    return fullString;

}

这是我目前正在使用的(在另一个 class 中)用于测试目的:

Toast.makeText(Setup.this, Functions.loadURL("http://www.exampleJSON.com"), Toast.LENGTH_LONG).show();

我计划使用输出提取 JSON if 语句的数据,保存在 sharedPreferences 中并显示。

编辑

这是我用来调用方法的内容:

public class Setup extends AppCompatActivity implements AdapterView.OnItemSelectedListener {

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

    final SharedPreferences preferences = this.getPreferences(Context.MODE_PRIVATE);
    final SharedPreferences.Editor editor = preferences.edit();

    final Spinner spinner = (Spinner) findViewById(R.id.spinner);

    final EditText editText = (EditText) findViewById(R.id.editText);


    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
            R.array.setup_region_spinner, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);

    spinner.setOnItemSelectedListener(this);

    //BUTTON PRESS

    Button button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            editor.putString("Server", String.valueOf(spinner.getSelectedItem()));

            if (String.valueOf(spinner.getSelectedItem()).equals("EUW")) {

            }

            else if (String.valueOf(spinner.getSelectedItem()).equals("NA")) {

                try {
                    Toast.makeText(Setup.this, Functions.loadURL("https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/" +
                            editText.getText().toString().replaceAll("\s", "") +
                            "?api_key=cbc50791-3c4d-45e6-b0c1-8aa204ced475"), Toast.LENGTH_LONG).show();
                }catch(Exception e){
                    e.printStackTrace();
                }

            }

            //ERROR

            else {

                Toast.makeText(Setup.this, "Server selection error", Toast.LENGTH_SHORT).show();

            }

        }
    });
}


@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
}

@Override
public void onNothingSelected(AdapterView<?> parent) {

}
}

try-block 是在通读答案后添加的。在我的 loadURL 方法中添加了另一个。它现在似乎工作。

我现在遇到错误,因为我试图 运行 在主线程上执行此操作。我将不得不阅读更多相关内容。

将您的代码放入 try 块中并捕获异常:

try {
String fullString = "";
    URL url = new URL(inputURL);
    BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
    String line;
    while ((line = reader.readLine()) != null) {
        fullString += line;
    }
    reader.close();

    return fullString;
} catch(Exception ex) {
ex.printStackTrace();
}
return null;

首先,完成基本的 JSON 格式。基本上有两件事要看:

  1. JSON对象
  2. JSON数组

一旦您对这两个感到满意,请尝试使用以下方法解析响应:

try{
  JSONObject jsonObject = new JSONObject(<your_response_string_here>);
  //Your parsing logic here
}catch(JSONException ex){
  ex.printStackTrace();
}

假设您的 json 是:

{
    "some_status": 200,
    "my_data": {
        "param1": "value1",
        "param2": "value2"
    },
    "my_array": ["arrayvalue1", "arrayvalue2"]
}

您的代码应如下所示:

try{
  JSONObject jsonObject = new JSONObject(<your_response_string_here>);
  //Your parsing logic here
  int status = jsonObject.optString("some_status");
  JSONObject my_data = jsonObject.optJSONObject("my_data");
  //Here parse your "my_data" object to get "param1" and "param2"
  JSONArray my_array = jsonObject.optJSONArray("my_array");
  //Here parse your "my_array" array to get "arrayvalue1" and "arrayvalue2"
}catch(JSONException ex){
  ex.printStackTrace();
}

请查看 Android 文档:http://developer.android.com/reference/org/json/JSONObject.html

还有一些例子,例如:http://www.tutorialspoint.com/android/android_json_parser.htm

希望对您有所帮助。