简体   繁体   English

OkHttp如何获取Json字符串?

[英]How does OkHttp get Json string?

Solution : It was a mistake on my side.解决方案:这是我这边的错误。

The right way is response.body().string() other than response.body.toString()正确的方法是response.body().string()而不是response.body.toString()

Im using Jetty servlet, the URL is http://172.16.10.126:8789/test/path/jsonpage , every time request this URL it will return我使用 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"}
]}

It shows up when type the url into a browser, unfortunately it shows kind of memory address other than the json string when I request with Okhttp .当在浏览器中键入 url 时它会显示,不幸的是,当我使用Okhttp请求时,它显示的是 memory 地址而不是 json 字符串。

TestActivity﹕ com.squareup.okhttp.internal.http.RealResponseBody@537a7f84

The Okhttp code Im using:我使用的 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();
}

Can anyone helpe?有人可以帮忙吗?

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

Example add to your columns:示例添加到您的列:

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

I am also faced the same issue我也面临同样的问题

use this code:使用此代码:

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

it definitely works它绝对有效

As I observed in my code.正如我在我的代码中观察到的那样。 If once the value is fetched of body from Response, its become blank.如果一旦从 Response 中获取了 body 的值,它就会变成空白。

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

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

So I believe after fetching once the value from body, it become empty.所以我相信从 body 中获取一次值后,它就会变成空的。

Suggestion : Store it in String, that can be used many time.建议:存放在String中,可以多次使用。

I hope you managed to obtain the json data from the json string.我希望您设法从 json 字符串中获取 json 数据。

Well I think this will be of help好吧,我认为这会有所帮助

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

Remember to use AsyncTask or SyncAdapter(IntentService), to prevent getting a NetworkOnMainThreadException请记住使用 AsyncTask 或 SyncAdapter(IntentService),以防止出现 NetworkOnMainThreadException

Also import the okhttp library in your build.gradle还要在 build.gradle 中导入 okhttp 库

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

Below code is for getting data from online server using GET method and okHTTP library for android kotlin...下面的代码用于使用 GET 方法和 android kotlin 的 okHTTP 库从在线服务器获取数据...

Log.e("Main", response.body!!.string() ) Log.e("Main", response.body!!.string() )

in above line !!在上面那一行!! is the thing using which you can get the json from 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())
                }
            })

I would like to add one more observation.我想再补充一项观察。 You can call.string() method only once.您只能调用一次 string() 方法。 If you try to call it twice, it will give you illegal state exception.如果你尝试调用它两次,它会给你非法的 state 异常。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM