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

时间:2016-03-16 11:23:10

标签: android json sockets

我试图使用socket来获取api的响应

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));  

得到回应:

  

HTTP / 1.1 200 OKServer:nginx / 1.8.1Date:Wed,2016年3月16日10:58:33   GMTContent-Type:text / html;字符集= UTF-8Transfer编码:   chunkedConnection:keep-aliveSet-Cookie:   ci_session =一%3A5%3A%7BS%3A10%3A%22session_id%22%3BS%3A32%3A%22b98d2cae90806cadfc2c4e08235e85f6%22%3BS%3A10%3A%22ip_address%22%3BS%3A15%3A%22202.166.198.151%22% 3BS%3A10%3A%22user_agent%22%3BB%3A0%3BS%3A13%3A%22last_activity%22%3Bi%3A1458125913%3BS%3A9%3A%22user_data%22%3BS%3A0%3A%22%22%3B% 7D1df5f1fdd7228e520f7b0873b21273df;   expires = Wed,16-Mar-2016 12:58:33 GMT;最大年龄= 7200;路径= /有所不同:   接受-Encoding389b { “UPDATE_DATE”:“2015年4月2日   5点31分26" 秒, “状态”: “成功”, “STATUS_MESSAGE”:“新   数据 “ ”数据“:[{ ”CAT_ID“: ”1“, ”cat_name“: ”艺术“, ”UPDATE_DATE“:” 2015年4月2日   5点30分44" 秒, “SUBCAT”:[]},{ “CAT_ID”: “2”, “cat_name”: “古董”, “UPDATE_DATE”:“2015年4月2日   五时三十分54" 秒, “SUBCAT”:[]},{ “CAT_ID”: “3”, “cat_name”: “汽车”, “UPDATE_DATE”:“2015年3月19日   21点11分14" 秒, “SUBCAT”:[]},{ “CAT_ID”: “4”, “cat_name”: “婴儿”, “UPDATE_DATE”:“2015年3月19日   21时13分07" 秒, “SUBCAT”:[]},{ “CAT_ID”: “5”, “cat_name”: “书籍”, “UPDATE_DATE”:“2015年4月2日   3点09分21" 秒, “SUBCAT”:[]}}

现在如何让json只能形成这个响应?
除了从{到}获取字符串之外,任何标准方法都可以做到这一点....

在(how to parse server socket input stream to get json object?)中询问了类似的问题,但没有回答。

2 个答案:

答案 0 :(得分:0)

为什么当你明显与网络服务器通话时,使用原始套接字而不是HTTP连接?

让一些库负责为您解析HTTP响应,并获取响应的JSON内容:

使用Google Guava

使用Resources.toString(URL, Charset)

URL url = ...
String json = Resources.toString(url, StandardCharsets.UTF_8);

你需要调整URL和可能的字符集(如果你控制服务器,那就是给你UTF-8,而不是让你的应用接受别的东西)。

使用Volley

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

使用普通Android SDK

如果您真的想要/必须避免使用库,请查看HttpURLConnection这是Android 6.0及更高版本的推荐HTTP客户端:http://developer.android.com/reference/java/net/HttpURLConnection.html

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

答案 1 :(得分:-1)

$path =  realpath('yourfolder/examplefolder/') . '{**/*,*}';

$all_files = array_diff(
  glob($path, GLOB_BRACE),
  glob($path, GLOB_BRACE | GLOB_ONLYDIR)
);