有人可以帮助我从网上获取json。在函数结束时,jsonResponse为空。我用这种方法来做到这一点:
private String getJson() {
jsonResponsce = "";
AsyncTask.execute(new Runnable() {
@Override
public void run() {
try{
URL httpbinEndpoint = new URL(webPage);
HttpsURLConnection myConnection = (HttpsURLConnection) httpbinEndpoint.openConnection();
myConnection.setRequestMethod("GET");
// Enable writing
myConnection.setDoOutput(true);
String internetData = "";
// Write the data
myConnection.getOutputStream().write(internetData.getBytes());
jsonResponsce = internetData;
} catch (IOException e) {
e.printStackTrace();
}
}
});
return jsonResponsce;
}
我为清单设置了Internet权限。我尝试从下一个地址获取Json:https://shori-dodjo-mobile-app.firebaseio.com/.json。完整代码放在此处:https://github.com/GenkoKaradimov/Shori-Dodjo-Android-App/
答案 0 :(得分:0)
您正在异步执行请求,因此该方法开始执行然后完成,因此没有结果。结果将在第二个,但到那时方法getJson已经完成。您最有可能需要在运行方法的末尾放置使用json的代码。
此外,您从流中读取的代码似乎有误。它可能应该像
BufferedReader br = new BufferedReader(new InputStreamReader(myConnection.getInputStream()));
jsonResponsce = br.lines().collect(Collectors.joining("\n"));
(我没有测试过这个)
答案 1 :(得分:0)
您的代码中存在多个问题:
首先,AsyncTask意味着它是异步(hronous),因此您无法立即返回结果。相反,覆盖AsyncTask的onPostExecute
并执行您需要处理的数据。 Here是示例实现。
其次,您正在使用getOutputStream
,用于写入连接,即将数据发送到服务器。在您的情况下,您需要getInputStream
并从中读取。最简单的方法是将它包装在BufferedReader中并读取,直到它返回-1
(标记流的结尾),然后转换为字符串。
有一些怪癖:您应该通过检查HTTP状态代码,处理编码(转换字节到字符串部分)以及处理压缩响应时的情况来处理或至少识别错误,例如:使用DEFLATE或gzip。我已经以纯Java方式实现了这一点(reference code,警告:过时的文档),但我认真地建议使用已建立的库之一,例如Retrofit或Volley。< / p>
答案 2 :(得分:0)
我认为你最好不要使用Volley。以下是一个很好的用法示例:https://stackoverflow.com/a/42601290/1450032
答案 3 :(得分:-1)
Json对象通常以HashMaps的形式返回。 所以你可能需要像HashMap这样的东西你的地图=新的HashMap&lt;〜&gt;(); 然后 yourMap.get(&#34;对方名称在另一边&#34;,var也被保存。); 现在看起来你要做的就是保存字节数据,但这个字节数据需要有一个类型。希望这可以帮助。