Android 从互联网访问 json 数据时出错
Android giving error while accessing json data from the internet
我是初学者,正在构建一个使用在线 API 的愚蠢应用程序。我将 .json 文件上传到 GitHub,我的应用程序从那里访问它并提供输出。但是,它始终运行 onErrorResponse 的语句。难道我做错了什么?
这是 MainActivity 的代码:
package com.example.jsonparsing;
import androidx.appcompat.app.AppCompatActivity;
import android.app.DownloadManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class MainActivity extends AppCompatActivity {
RequestQueue requestQueue;
Button search;
EditText input;
TextView word;
TextView meaning;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
search = findViewById(R.id.button_getMeaning);
input = findViewById(R.id.editText_input);
word = findViewById(R.id.textView_word);
meaning = findViewById(R.id.textView_meaning);
requestQueue = Volley.newRequestQueue(this);
search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String term = input.getText().toString().toLowerCase();
String displayInput = term.toUpperCase() + ":";
word.setText(displayInput);
JsonObjectRequest jsonObjectRequest1 = new JsonObjectRequest(Request.Method.GET, "https://github.com/DeathVenom54/bonerDictionaryDatabase/blob/master/definitions.json", null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
String definition = response.getString(term);
meaning.setText(definition);
} catch (JSONException e) {
e.printStackTrace();
meaning.setText("Sorry, this word doesn't exist in the boner database.");
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this, "Connection error, please check internet connection.", Toast.LENGTH_SHORT).show();
}
});
requestQueue.add(jsonObjectRequest1);
}
});
}
}
该项目使用Volley
并且我在清单中添加了Internet权限。
编辑:这是 .json :
https://github.com/DeathVenom54/bonerDictionaryDatabase/blob/master/definitions.json
您发布的 json url 是 link 到某人 github 页面的 json,但不是 json本身。最有可能发生的情况是 volley 正在下载包含 json 的整个 HTML 页面。然后抱怨它的格式不正确 json.
如果您想要 json 直接,您需要找到一种方法将其托管在某个地方。例如 github 有一个 api,您可以像这样访问 json 个文件 https://api.github.com/users/mralexgray/repos
对于本地测试,您始终可以将其复制到本地 json 文件并导入到您应用的 res/raw
并从那里引用它。
我是初学者,正在构建一个使用在线 API 的愚蠢应用程序。我将 .json 文件上传到 GitHub,我的应用程序从那里访问它并提供输出。但是,它始终运行 onErrorResponse 的语句。难道我做错了什么? 这是 MainActivity 的代码:
package com.example.jsonparsing;
import androidx.appcompat.app.AppCompatActivity;
import android.app.DownloadManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class MainActivity extends AppCompatActivity {
RequestQueue requestQueue;
Button search;
EditText input;
TextView word;
TextView meaning;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
search = findViewById(R.id.button_getMeaning);
input = findViewById(R.id.editText_input);
word = findViewById(R.id.textView_word);
meaning = findViewById(R.id.textView_meaning);
requestQueue = Volley.newRequestQueue(this);
search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String term = input.getText().toString().toLowerCase();
String displayInput = term.toUpperCase() + ":";
word.setText(displayInput);
JsonObjectRequest jsonObjectRequest1 = new JsonObjectRequest(Request.Method.GET, "https://github.com/DeathVenom54/bonerDictionaryDatabase/blob/master/definitions.json", null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
String definition = response.getString(term);
meaning.setText(definition);
} catch (JSONException e) {
e.printStackTrace();
meaning.setText("Sorry, this word doesn't exist in the boner database.");
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this, "Connection error, please check internet connection.", Toast.LENGTH_SHORT).show();
}
});
requestQueue.add(jsonObjectRequest1);
}
});
}
}
该项目使用Volley
并且我在清单中添加了Internet权限。
编辑:这是 .json : https://github.com/DeathVenom54/bonerDictionaryDatabase/blob/master/definitions.json
您发布的 json url 是 link 到某人 github 页面的 json,但不是 json本身。最有可能发生的情况是 volley 正在下载包含 json 的整个 HTML 页面。然后抱怨它的格式不正确 json.
如果您想要 json 直接,您需要找到一种方法将其托管在某个地方。例如 github 有一个 api,您可以像这样访问 json 个文件 https://api.github.com/users/mralexgray/repos
对于本地测试,您始终可以将其复制到本地 json 文件并导入到您应用的 res/raw
并从那里引用它。