V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
creatorYC
V2EX  ›  问与答

android 中解析 json 字符串的问题, json 字符串是被压缩过的

  •  
  •   creatorYC · 2015-08-09 18:16:56 +08:00 · 3684 次点击
    这是一个创建于 3176 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在做天气预报程序的时候遇到的问题,我通过 android 里面 HttpUrlConnection 连接到 http://wthrcdn.etouch.cn/weather_mini?city=北京 这个网址,可以根据城市名查询天气信息,它返回的是一个 json 字符串,但是网上说这个网址返回的 json 字符串是被压缩过的,因此要自己解析,我用 GZIPInputStream 去解压缩,在 java 里面可以正常打印出结果,代码和结果如下:

    new Thread(new Runnable() {

    private boolean isGZip = true;
    
            @Override
            public void run() {
                HttpURLConnection connection = null;
                try {
                    URL url = new URL("http://wthrcdn.etouch.cn/weather_mini?city=芜湖");
                    //URL url = new URL("http://www.weather.com.cn/data/list3/city.xml");
                    connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(8000);
                    connection.setReadTimeout(8000);
                    String response = "";
                    if (connection.getResponseCode() == 200) {// 判断请求码是否是200码,否则失败
                        InputStream is = connection.getInputStream(); // 获取输入流
                        System.out.println(connection.getContentEncoding());
                        if (isGZip ) {
    
                            //InflaterInputStream ilis = new InflaterInputStream(is);
                            GZIPInputStream in = new GZIPInputStream(is);
                            BufferedReader reader = new BufferedReader(
                                    new InputStreamReader(in, "utf-8"));
                            String line = "";
                            while ((line = reader.readLine()) != null) {
                                response += line;
                            }
                        } else {
                            BufferedReader reader = new BufferedReader(
                                    new InputStreamReader(is, "utf-8"));
                            String line = "";
                            while ((line = reader.readLine()) != null) {
                                response += line;
                            }
                        }
                    }
                    System.out.println(response);
                } catch (Exception e) {
                } finally {
                    if (connection != null) {
                        connection.disconnect();
                    }
                }
            }
        }).start();
    

    运行结果是这样的:
    gzip
    {"desc":"OK","status":1000,"data":{"wendu":"26","ganmao":"相对于今天将会出现大幅度降温,空气湿度较大,易发生感冒,请注意适当增加衣服。","forecast":[{"fengxiang":"北风","fengli":"3-4级","high":"高温 28","type":"中雨","low":"低温 26","date":"9日星期天"},{"fengxiang":"北风","fengli":"微风级","high":"高温 29","type":"大雨","low":"低温 25","date":"10日星期一"},{"fengxiang":"北风","fengli":"微风级","high":"高温 28","type":"小雨","low":"低温 24","date":"11日星期二"},{"fengxiang":"西北风","fengli":"3-4级","high":"高温 27","type":"多云","low":"低温 23","date":"12日星期三"},{"fengxiang":"东风","fengli":"微风级","high":"高温 30","type":"多云","low":"低温 23","date":"13日星期四"}],"yesterday":{"fl":"4-5级","fx":"东风","high":"高温 32","type":"雷阵雨","low":"低温 27","date":"8日星期六"},"city":"芜湖"}}
    可是,这完全相同的程序放在 android 里面执行时,我跟踪到 GZIPInputStream in = new GZIPInputStream(is); 这一句时,程序抛异常,直接走 catch 中的代码了,异常是 java.io.IOException: unknown format (magic number 227b),搞了好久了都解决不了,求大神帮忙解决!不胜感激

    7 条回复    2015-08-09 21:56:16 +08:00
    ss098
        1
    ss098  
       2015-08-09 18:18:59 +08:00
    本例压缩过的含义是去除了换行符以及多余的空格,而不是 GZip。
    creatorYC
        2
    creatorYC  
    OP
       2015-08-09 18:33:55 +08:00
    @ss098 看那运行结果,显示gzip,而且,在java测试里面是正常显示的
    ss098
        3
    ss098  
       2015-08-09 19:05:34 +08:00
    @creatorYC 我不懂 Java,通常 HTTP 库已经帮你处理好了 GZip 以及相关的网络问题,所以只需要调用 JSON 解析库去解析这个字符串。
    ss098
        4
    ss098  
       2015-08-09 19:07:56 +08:00
    可能是我理解不对,可以参考。

    http://stackoverflow.com/questions/14684534/gzip-for-android
    hahasong
        5
    hahasong  
       2015-08-09 19:15:09 +08:00
    http://stackoverflow.com/questions/16442516/android-httpurlconnection-gzip-compression

    去掉Gzip条件,HttpURLConnection应该自动帮你处理了
    creatorYC
        6
    creatorYC  
    OP
       2015-08-09 21:55:11 +08:00
    @hahasong 为什么放在java里面需要自己解压啊,不然就报错,向那程序结果那样。android 里面是不需要解压,我已经解决了,但很困惑
    creatorYC
        7
    creatorYC  
    OP
       2015-08-09 21:56:16 +08:00
    @ss098 恩,我去掉了可以了,但我不明白为什么在java写的那个测试方法里面需要手动解压,不然就有异常,很困惑
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2585 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:19 · PVG 12:19 · LAX 21:19 · JFK 00:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.