OkHttp 如何得到 Json string?

解决方案 : 在我这边是个错误。

正确的方法是 Body () . string ()而不是 ToString ()

我使用 Jetty servlet,URL 是 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 代码:

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();
}

有人能帮忙吗?

128208 次浏览
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);
}
}

添加到列中的示例:

JCol employees  = new employees();
colums.Setid(object.getInt("firstName"));
columnlist.add(lastName);

我希望您能够从 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");


//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);
}

请记住使用 AsyncTask 或 SyncAdapter (InentService) ,以防止出现 NetworkOnMainThreadException 异常

还要在 build.gradle 中导入 okhttp 库

compile 'com.squareup.okhttp:okhttp:2.4.0'

我也面临着同样的问题

使用以下代码:

// notice string() call
String resStr = response.body().string();
JSONObject json = new JSONObject(resStr);

绝对管用

正如我在代码中观察到的。 如果从 Response 获取 body 的值后,它将变为空白。

String str = response.body().string();  // {response:[]}


String str1  = response.body().string();  // BLANK

所以我相信一旦取出身体的价值,它就会变成空的。

建议: 存储在字符串,可以使用很多次。

下面的代码是用 GET 方法和 okHTTP 库为 android kotlin 从在线服务器获取数据..。

E (“ Main”,Body! ! . string ())

在上面的行中! ! 是您可以从 response body 获得 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())
}
})

我想再补充一点。你可以打电话。String ()方法只有一次。如果您尝试调用它两次,它会给您非法的状态异常。