Android studio获取服务器端json数据并解析

最近在做Android的一个项目,涉及到Android studio与服务器端通信问题,在网上看了很多,找到了一些解决办法,这篇文章就简单介绍一下如何获取以及向服务器上传json数据。

在这个项目中,我们使用的json数据格式获取和上传数据,不多说废话,直接上代码,代码里有详细注释。

1.获取服务器端数据

以下是采用get方式获取服务器端数据,不需要传值,直接获得数据,所以直接采用默认的get方式,建立http连接,获取数据就行了,在我们的项目中,我们获取数据都是先获取到String类型的数据,再将其转化为json数据并解析,下面是获取String数据的函数:

    public static String gethttpresult(String urlStr){
        try {
            URL url=new URL(urlStr);
            HttpURLConnection connect=(HttpURLConnection)url.openConnection();
            InputStream input=connect.getInputStream();
            BufferedReader in = new BufferedReader(new InputStreamReader(input));
            String line = null;
            System.out.println(connect.getResponseCode());
            StringBuffer sb = new StringBuffer();
            while ((line = in.readLine()) != null) {
                sb.append(line);
            }
            return sb.toString();
        } catch (Exception e) {
            System.out.println(e.toString());
            return null;
        }
    }

除了直接获取结果外,更多的时候我们需要向服务器端传递一些参数,在我们的项目中采用post方式,向服务器传递参数获取想要的数据,对于post的json数据,我们也做了两种尝试:

 第一种json构造方式,直接构造json数据

 /**
     * 检查用户账号密码是否正确
     * @param urlStr 接口url
     * @param user_phone    用户输入的帐号
     * @param user_password     用户输入的密码
     * @return
     */
    public static String checkuser(String urlStr,String user_phone,String user_password){
        String params = "{\"user_phone\":" +user_phone +",\"user_password\":" + user_password+  "}";
        try {
            URL url=new URL(urlStr);
            HttpURLConnection connect=(HttpURLConnection)url.openConnection();
            connect.setDoInput(true);
            connect.setDoOutput(true);
            connect.setRequestMethod("POST");
            connect.setUseCaches(false);
            connect.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
            OutputStream outputStream = connect.getOutputStream();
            outputStream.write(params.getBytes());
            int response = connect.getResponseCode();
            if (response== HttpURLConnection.HTTP_OK)
            {
                System.out.println(response);
                InputStream input=connect.getInputStream();
                BufferedReader in = new BufferedReader(new InputStreamReader(input));
                String line = null;
                StringBuffer sb = new StringBuffer();
                while ((line = in.readLine()) != null) {
                    sb.append(line);
                }
                return sb.toString();
            }
            else {
                System.out.println(response);
                return " ";
            }
        } catch (Exception e) {
            Log.e("e:", String.valueOf(e));
            return e.toString();
        }
    }
  第二种构造方式,采用json数据格式转换
/**
     * 获得搜索结果
     * @param bookName  用户输入的书籍关键字
     * @return
     */
    public static String getsearchresult(String bookName){
        String h="http://122.114.237.201/getbook/search";
        JSONObject object=new JSONObject();

        try {
            object.put("bookName",bookName);

            String content = String.valueOf(object);
            URL url=new URL(h);
            HttpURLConnection connect=(HttpURLConnection)url.openConnection();
            connect.setDoInput(true);
            connect.setDoOutput(true);
            connect.setRequestMethod("POST");
            connect.setUseCaches(false);
            connect.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
            OutputStream outputStream = connect.getOutputStream();
            outputStream.write(content.getBytes());
            int response = connect.getResponseCode();
            System.out.println(connect);
            if (response== HttpURLConnection.HTTP_OK)
            {
                System.out.println(response);
                InputStream input=connect.getInputStream();
                BufferedReader in = new BufferedReader(new InputStreamReader(input));
                String line = null;
                System.out.println(connect.getResponseCode());
                StringBuffer sb = new StringBuffer();
                while ((line = in.readLine()) != null) {
                    sb.append(line);
                }
                return sb.toString();
            }
            else {
                System.out.println(response);
                return "not exsits";
            }
        } catch (Exception e) {
            Log.e("e:", String.valueOf(e));
            return "internet errar";
        }
    }

在一些情况下两种方法使用都没有问题,但是在一些情况下只有第二种方法才有效,至今未搞懂为什么,如果有知道的,欢迎在下方评论,建议使用第二种,犯错误的概率会小很多。

2.解析json数据

获取到String数据以后,我们要做的事就是把他转化为json数据格式并且解析,对于不同的json数据,其内容也不尽相同,一下是示例代码:

   new Thread(){
            @Override
            public void run() {
                String result= internet.gethttpresult(url);
                System.out.println(result);
                if(result==null)
                {
                    Looper.prepare();
                    Toast.makeText(getContext(),"网络连接错误!",Toast.LENGTH_SHORT).show();
                    Looper.loop();
                }
                else
                {
                    try {
                        JSONObject result_json=new JSONObject(result);
                        JSONArray picture=result_json.getJSONArray("picture");
                        JSONArray booklist=result_json.getJSONArray( "Booklist");
                        JSONArray articlelist=result_json.getJSONArray("Articlelist");
                        for (int i = 0; i < picture.length(); i++) {
                            JSONObject object=picture.getJSONObject(i);
                            picture_urls.add(object.getString("url"));
                        }
                        for (int i = 0; i < 3; i++) {
                            JSONObject object=booklist.getJSONObject(i);
                            book_id.add(object.getInt("bookId"));
                            book_name.add(object.getString("bookName"));
                            book_img.add(object.getString("bookPicture"));
                        }
                        for (int i = 0; i < 2; i++) {
                            JSONObject object=articlelist.getJSONObject(i);
                            System.out.println(object.getString("articleContext"));
                            article_id.add(object.getInt("articleId"));
                            article_name.add(object.getString("articleName"));
                            article_img.add(object.getString("articlePicture"));
                            article_author.add(object.getString("articleAuthor"));
                            article_hot.add(object.getInt("articleHot"));
                        }
                       

                    } catch (JSONException e) {
                        e.printStackTrace();
                        System.out.println(e.toString());
                        Looper.prepare();
                        Toast.makeText(getContext(),"文件解析错误!",Toast.LENGTH_SHORT).show();
                        Looper.loop();
                    }
                }

            }
        }.start();

3.一些错误的解决办法。

在与服务器端的交互通信过程中,不管是获取还是上传数据,在做的时候都遇到了很多问题,比如json格式问题等。下面列举一些常见问题。

1.在Android中进行网络连接最需要注意的地方是不能再ui线程进行网络访问,一定要new一个子线程进行访问。

2.在子线程进行网络访问时往往需要更改控件,然而在子线程中不能更改控件,解决办法是可以用runable,具体大家可以百度。

4.其他。

另外提一句,我们做的项目是一个阅读app,做出来的效果大概是下面这样。

下面附上源码以及app,大家感兴趣的可以尝试,如果有需要可以留言或发邮件给我(1823044724@qq.com)

源码包:https://pan.baidu.com/s/1xFxA78LPT-7U1gwmadHl-Q

app:https://pan.baidu.com/s/1IX6gbtKHvDSo471OCxVa_w

  • 34
    点赞
  • 270
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值