Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OkHttp如何获取Json字符串?_Java_Http_Okhttp_Embedded Jetty - Fatal编程技术网

Java OkHttp如何获取Json字符串?

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

解决方案: 这对我来说是个错误

正确的方法是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代码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())
                }
            })