OkHttp如何获取Json字符串?

Posted

技术标签:

【中文标题】OkHttp如何获取Json字符串?【英文标题】:How does OkHttp get Json string? 【发布时间】:2015-03-29 01:58:58 【问题描述】:

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

正确的方法是 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", "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();

谁能帮忙?

【问题讨论】:

它从 char 字节和字符集构造 String 对象。 @NikolaDespotoski 谢谢!这是我自己的错误。我将response.body().string() 替换为response.body().toString()... @haifzhan 感谢您澄清使用 response.body().string() 而不是 response.body().toString() 【参考方案1】:
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);           

【讨论】:

我现在遇到了异常:org.json.JSONException: Value okhttp3.internal.http.RealResponseBody@aeb56f3 of type java.lang.String cannot be converted to JSONObject 很容易犯的错误是将.string()与'.toString()'混淆 您应该指定从何处获取对象,例如 JSONObject。请也包括进口。 我正在尝试使用 Okhttp (3.x.x) 进行简单请求,这是请求的基础吗? responses.body().string() 只能调用一次直接使用此代码://String jsonData = responses.body().string(); JSONObject Jobject = new JSONObject(responses.body().string());【参考方案2】:

我也遇到了同样的问题

使用此代码:

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

确实有效

【讨论】:

非常感谢!有趣的是,文档中没有关于 string() 方法的信息。但它确实有效 非常感谢您的回答。这对我帮助很大!奇怪的是,我在互联网上的其他任何地方都找不到这个! 非常感谢。string() 很奇怪,但效果很好! 对于包含 dataerror 对象的 OKHttp3 GraphQL 响应,这也适用。 添加 toString() 不是多余的吗?你应该只需要 response.body().string()。返回字符串。【参考方案3】:

正如我在代码中观察到的那样。 如果一旦从 Response 中取出 body 的值,它就会变成空白。

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

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

所以我相信在从 body 中获取一次值后,它会变成空的。

建议:存储在String中,可以多次使用。

【讨论】:

非常感谢。一段时间以来一直试图弄清楚这一点,但上述答案都没有真正帮助,因为我首先记录了整个身体,然后尝试获取字符串,这实际上是问题所在。【参考方案4】:

我希望你设法从 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(IntentService),以防止出现 NetworkOnMainThreadException

同时在你的 build.gradle 中导入 okhttp 库

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

【讨论】:

我可以和这个一起使用DownloadManager吗? 如果您注意到,下载文件后,您的状态栏上会出现一个闪烁的白色向下箭头。表示你下载了一些东西。由DownloadManager 处理【参考方案5】:

以下代码用于使用 GET 方法和 okHTTP 库从在线服务器获取数据,用于 android kotlin...

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

【讨论】:

以上是关于OkHttp如何获取Json字符串?的主要内容,如果未能解决你的问题,请参考以下文章

okhttp 请求成功后怎么的返回数据

如何在android中使用OkHttp从web api获取json数据到RecyclerView

OkHttp 以 JSON 形式发布正文

如何用Java向kafka发送json数据

gson解析通过okhttp获取的json格式数据(转载)

无法让 OkHttp 的 response.body.toString() 返回字符串