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() 很奇怪,但效果很好! 对于包含data
和 error
对象的 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字符串?的主要内容,如果未能解决你的问题,请参考以下文章