Java OkHttp如何获取Json字符串?
解决方案: 这对我来说是个错误 正确的方法是response.body().string()而不是response.body.toString() 我正在使用Jetty servlet,URL是Java OkHttp如何获取Json字符串?,java,http,okhttp,embedded-jetty,Java,Http,Okhttp,Embedded Jetty,解决方案: 这对我来说是个错误 正确的方法是response.body().string()而不是response.body.toString() 我正在使用Jetty servlet,URL是http://172.16.10.126:8789/test/path/jsonpage,每次请求此URL时,它都会返回 {"employees":[ {"firstName":"John", "lastName":"Doe"}, {"firstName":"Anna", "lastNa
http://172.16.10.126:8789/test/path/jsonpage
,每次请求此URL时,它都会返回
{"employees":[
{"firstName":"John", "lastName":"Doe"},
{"firstName":"Anna", "lastName":"Smith"},
{"firstName":"Peter", "lastName":"Jones"}
]}
在浏览器中键入url时会显示它,不幸的是,当我使用Okhttp
请求时,它会显示除json字符串以外的内存地址
TestActivity﹕ com.squareup.okhttp.internal.http.RealResponseBody@537a7f84
Okhttp代码Im使用:
OkHttpClient client = new OkHttpClient();
String run(String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
有人能帮忙吗?我希望您能够从json字符串中获取json数据
try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(urls[0])
.build();
Response responses = null;
try {
responses = client.newCall(request).execute();
} catch (IOException e) {
e.printStackTrace();
}
String jsonData = responses.body().string();
JSONObject Jobject = new JSONObject(jsonData);
JSONArray Jarray = Jobject.getJSONArray("employees");
for (int i = 0; i < Jarray.length(); i++) {
JSONObject object = Jarray.getJSONObject(i);
}
}
我想这会有帮助的
try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(urls[0])
.build();
Response responses = null;
try {
responses = client.newCall(request).execute();
} catch (IOException e) {
e.printStackTrace();
}
String jsonData = responses.body().string();
JSONObject Jobject = new JSONObject(jsonData);
JSONArray Jarray = Jobject.getJSONArray("employees");
//define the strings that will temporary store the data
String fname,lname;
//get the length of the json array
int limit = Jarray.length()
//datastore array of size limit
String dataStore[] = new String[limit];
for (int i = 0; i < limit; i++) {
JSONObject object = Jarray.getJSONObject(i);
fname = object.getString("firstName");
lname = object.getString("lastName");
Log.d("JSON DATA", fname + " ## " + lname);
//store the data into the array
dataStore[i] = fname + " ## " + lname;
}
//prove that the data was stored in the array
for (String content ; dataStore ) {
Log.d("ARRAY CONTENT", content);
}
试试看{
OkHttpClient=新的OkHttpClient();
Request Request=newrequest.Builder()
.url(url[0])
.build();
响应=空;
试一试{
responses=client.newCall(request.execute();
}捕获(IOE异常){
e、 printStackTrace();
}
String jsonData=responses.body().String();
JSONObject Jobject=新的JSONObject(jsonData);
JSONArray Jarray=Jobject.getJSONArray(“员工”);
//定义将临时存储数据的字符串
字符串fname,lname;
//获取json数组的长度
int limit=Jarray.length()
//大小限制的数据存储阵列
字符串数据存储[]=新字符串[限制];
对于(int i=0;i
请记住使用AsyncTask或SyncAdapter(IntentService),以防止获取NetworkOnMainThreadException
同时在build.gradle中导入okhttp库
编译'com.squareup.okhttp:okhttp:2.4.0'
我也面临同样的问题
使用此代码:
// notice string() call
String resStr = response.body().string();
JSONObject json = new JSONObject(resStr);
正如我在代码中所观察到的那样,它确实有效。
如果一旦从响应中获取了body的值,则它将变为空
String str = response.body().string(); // {response:[]}
String str1 = response.body().string(); // BLANK
所以我相信一旦从body中获取了值,它就会变成空的
建议:以字符串形式存储,可以多次使用。下面的代码用于使用GET方法和android kotlin的okHTTP库从在线服务器获取数据 Log.e(“Main”,response.body!!.string()) 在上面的一行中!!是可以从响应体获取json的东西
val client = OkHttpClient()
val request: Request = Request.Builder()
.get()
.url("http://172.16.10.126:8789/test/path/jsonpage")
.addHeader("", "")
.addHeader("", "")
.build()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
// Handle this
Log.e("Main","Try again latter!!!")
}
override fun onResponse(call: Call, response: Response) {
// Handle this
Log.e("Main",response.body!!.string())
}
})
它从字符字节和字符集构造字符串对象。@NikolaDespotoski谢谢!这是我自己的错误。我将
response.body().String()
替换为response.body().toString()
。@haifzhan感谢您澄清response.body().String()而不是response.body().toString()的用法非常感谢!有趣的是,文档中没有关于string()方法的信息。但它实际上很有效。非常感谢您的回答。这对我帮助很大!奇怪的是,我在internet上的其他任何地方都找不到它!非常感谢您。关于string()很奇怪但是它工作得很好!对于包含数据
和错误
对象的OKHttp3 GraphQL响应,这也适用。添加toString()不是多余的吗?您应该只需要response.body().string(),返回字符串。我现在得到异常:org.json.JSONException:Value-okhttp3.internal.http。RealResponseBody@aeb56f3无法将java.lang.String类型转换为JSONObject
非常容易的错误是将.String()
与.toString()混淆'您应该指定从何处获取对象,如JSONObject。请也包括导入。我正在尝试使用Okhttp(3.x.x)执行简单的请求,这是请求的基础吗?responses.body().string()
只需调用一次直接使用此代码:
//string jsonData=responses.body().string();JSONObject Jobject=新的JSONObject(responses.body().string())
我可以将下载管理器
与此一起使用吗?如果您注意到,一旦您下载了一个文件,您的状态栏上就会出现一个闪烁的白色向下箭头。这表示您下载了一些东西。这是下载管理器
处理的。非常感谢您。您已经尝试了一段时间,但上面的答案都不正确y帮助了我,因为我首先记录了整个身体,然后试图获取字符串,而这实际上就是问题所在。
val client = OkHttpClient()
val request: Request = Request.Builder()
.get()
.url("http://172.16.10.126:8789/test/path/jsonpage")
.addHeader("", "")
.addHeader("", "")
.build()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
// Handle this
Log.e("Main","Try again latter!!!")
}
override fun onResponse(call: Call, response: Response) {
// Handle this
Log.e("Main",response.body!!.string())
}
})