尝试从 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 格式。基本上有两件事要看:
- JSON对象
- 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
希望对您有所帮助。
我正在尝试从 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 格式。基本上有两件事要看:
- JSON对象
- 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
希望对您有所帮助。