失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Android studio获取服务器端json数据并解析

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

时间:2019-11-22 02:14:52

相关推荐

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(){@Overridepublic 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@)

源码包:/s/1xFxA78LPT-7U1gwmadHl-Q

app:/s/1IX6gbtKHvDSo471OCxVa_w

如果觉得《Android studio获取服务器端json数据并解析》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。