Android 解析服务器套接字输入流以获取json对象

Android 解析服务器套接字输入流以获取json对象,android,json,sockets,Android,Json,Sockets,我试图使用套接字从api获取响应 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 得到的答复是: HTTP/1.1 200 OKServer:nginx/1.8.1日期:Wed,2016年3月16日10:58:33 GMT内容类型:文本/html;字符集=UTF-8传输编码: chunkedConnection:保留aliveSet Cookie: 中文常用常用词

我试图使用套接字从api获取响应

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
得到的答复是:

HTTP/1.1 200 OKServer:nginx/1.8.1日期:Wed,2016年3月16日10:58:33 GMT内容类型:文本/html;字符集=UTF-8传输编码: chunkedConnection:保留aliveSet Cookie: 中文常用常用词汇词汇,常用常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇,常用词汇3df; expires=Wed,2016年3月16日12:58:33 GMT;最大年龄=7200岁;路径=/变化: 接受编码389b{“更新日期”:“2015-04-02 05:31:26,“状态”:“成功”,“状态信息”:“新建” 数据“,”数据“:[{“cat_id:”1“,”cat_名称“:”艺术“,”更新日期“:”2015-04-02 05:30:44,“子类别”:[]},{“类别id”:“2”,“类别名称”:“古董”,“更新日期”:“2015-04-02” 05:30:54,“子类别”:[]},{“类别id”:“3”,“类别名称”:“汽车”,“更新日期”:“2015-03-19 21:11:14,“子类别”:[]},{“类别id”:“4”,“类别名称”:“婴儿”,“更新日期”:“2015-03-19 21:13:07,“子类别”:[]},{“类别id”:“5”,“类别名称”:“书籍”,“更新日期”:“2015-04-02 03:09:21,“子类别”:[]}

现在如何仅从该响应获取json??
除了从{to}获取字符串之外,还有其他标准的方法吗


类似的问题在()中提出,但没有得到回答。

当您显然在与web服务器对话时,为什么要使用原始套接字而不是HTTP连接

     String msg = "";

       BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        try {
            while ((line = rd.readLine()) != null) {
                msg.append(line);                     // get the MSG as String
            }
        } catch (Exception e) {
            Toast.makeText(this, "Stream Exception", Toast.LENGTH_SHORT).show();
        }

int index=line.indexOf('{');  // index from JSON response starts
line=line.substring(index);
JSONObject object=new JSONObject(line);

// from here get your data.
让一些库为您解析HTTP响应,只需获取响应的JSON内容:

使用:

您需要修改URL,可能还需要修改字符集(如果您控制了服务器,请将其设置为UTF-8,而不是让您的应用程序接受其他内容)

字符串url=。。。
RequestQueue=Volley.newRequestQueue(this);
StringRequest=新的StringRequest(request.Method.GET,url,
新的Response.Listener(){
@凌驾
公共void onResponse(字符串响应){
//响应是您的JSON
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
//事情出了差错
}
});
添加(stringRequest);
使用普通Android SDK

如果您确实想/必须避免使用库,请查看推荐用于Android 6.0及更高版本的HTTP客户端:


尽量避免这种情况,因为你更可能从事构建应用程序的工作,而不是编写其他地方已经存在的随机IO代码(可能有更少的bug和更好的测试覆盖率)。

如果JSON响应是一个数组或只是一个基元,如果任何头包含
{
,如果响应不是以Android假定的默认字符集进行编码。它也不会关闭套接字,泄漏宝贵的本地资源。感谢您的响应,但我正试图爬进这个网络的核心…谁知道有一天我可能会建成比现在更好的库:)我为您的学习愿望鼓掌!如果您打算在Play Store上发布应用程序,我建议您使用这些库中的一个,而不是滚动自己的库,因为您会犯错误,否则您的用户会受到影响。为了学习,您可以阅读Guava、Volley、Apache HttpClient和HttpURLConnection的代码(都是开源的)并尝试重新实现其中的一部分,以了解套接字、网络和HTTP是如何工作的。
URL url = ...
String json = Resources.toString(url, StandardCharsets.UTF_8);
String url = ...
RequestQueue queue = Volley.newRequestQueue(this);
StringRequest request = new StringRequest(Request.Method.GET, url,
    new Response.Listener<String>() {
      @Override
      public void onResponse(String response) {
        // response is your JSON
      }
    }, new Response.ErrorListener() {
      @Override
      public void onErrorResponse(VolleyError error) {
        // stuff went wrong
      }
    });
queue.add(stringRequest);