首先,项目中使用javaweb作为后台服务器,源码地址:服务器和客户端源码地址。
接下来进入正题。
   
   一、java web服务器
        
         这里就多说了,不太了解j2ee的请查阅相关书籍。
      
         项目结构如下:
       
        News类定义了之后解析的JSON对象的内容;
        NewsServer则是定义了一个获取最新新闻News的接口;
        NewsServer则是实现了这个接口,定义了获取最新新闻的方法;
        NewsListServlet则是一个实现客户端get和post请求的servlet,用于实现网络请求时的业务逻辑处理,主要返回含有News内容的json字符串;
        jsonnewslist.jsp是一个jsp文件用于测试服务器是否正常运行。
      
      服务器部分就不啰嗦了,直接贴代码和截图
      
  (1)News类
 public class News {private Integer id;private String title;private Integer timelength;public News(Integer id, String title, Integer timelength) {this.id = id;this.title = title;this.timelength = timelength;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public Integer getTimelength() {return timelength;}public void setTimelength(Integer timelength) {this.timelength = timelength;}
}

(2)NewsServer接口

public interface NewsServer {/** 获取最新的新闻News*/public java.util.List<News> getLastNews();}

(3)NewsServerBean类

import java.util.ArrayList;
import java.util.List;public class NewsServerBean implements NewsServer {@Overridepublic List<News> getLastNews() {// TODO Auto-generated method stubList<News> news = new ArrayList<>();news.add(new News(10, "吕文健", 20));news.add(new News(45, "李昱喜", 10));news.add(new News(89, "android is amazing", 50));return news;}}

(4)NewsListServlet类

import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet(name="newslist",urlPatterns={"/newslist"})//配置Servlet
public class NewsListServlet extends HttpServlet {/*** */private static final long serialVersionUID = 1L;NewsServerBean serverbean =new NewsServerBean();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stubdoPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// TODO Auto-generated method stubreq.setCharacterEncoding("GBK");
     resp.setCharacterEncoding("GBK");//这里设置成gbk防止手机端显示乱码,之前设置为utf-8总是乱码List<News> news = serverbean.getLastNews();
      StringBuilder json = new StringBuilder();json.append("[");for(News news2:news){json.append('{').append("\"id\":").append(news2.getId()).append(",");                      json.append("\"title\":").append("\""+news2.getTitle()+"\"").append(",");json.append("\"timelength\":").append(news2.getTimelength());json.append('}').append(",");}json.deleteCharAt(json.length()-1);//?json.append("]");req.setAttribute("json", json.toString());req.getRequestDispatcher("/jsonnewslist.jsp").forward(req, resp);}
}
    (5)jsonnewslist.jsp(在服务端测试服务器是否布置成功)

<%@ page language="java" contentType="text/plain; charset=GBK"pageEncoding="GBK"%>${json}

(6)服务器运行结果


    

OK,运行成功,服务器解决了,楼主把它打包成war,放在阿里云服务器上,省去了用电脑做服务器的各种麻烦。接下来进入正题,客户端解析Json

二、android客户端
     客户端部分主要是一个简单的listview显示获取的news,运行结果如下:
接下来,开始贴代码:
    1、布局文件:
    (1)activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="wf.com.getnewsinjson.MainActivity">
<Button
    android:id="@+id/btn_refresh"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:text="刷新"
    />
    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"

        />
</LinearLayout>

(2)item.xml(ListView中每一个item的布局)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <TextView
        android:id="@+id/title"
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:layout_weight="1"
        android:gravity="center"
        />
    <TextView
        android:layout_marginLeft="10dp"
        android:id="@+id/timelength"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="50dp"
        android:gravity="center"
        />
</LinearLayout>

2、主要代码

  (1)、News类(和之前服务器中的一样,用于解析)
   (2)、NewsServer类(用于连接服务器并解析JSON字符串)
import android.util.Log;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import Util.StreamTool;

/**
 * Created by wangfeng on 2016/12/8.
 */

public class NewsService {public static List<News> getJsonLastNews() {List<News> list = null;
        InputStream in = null;
                String path = "http://*****";//这里输入自己的服务器地址
                try {list = new ArrayList<>();
                    URL url = new URL(path);
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setConnectTimeout(5000);
                    conn.setRequestMethod("GET");
                    if (conn.getResponseCode()==200){in = conn.getInputStream();
                        list = parseJSON(in);
                    }} catch (MalformedURLException e) {e.printStackTrace();
                    System.out.println("客户端未连接到服务器");
                } catch (IOException e) {e.printStackTrace();
                    System.out.println("客户端未连接到服务器");
                }return list;
    }
/*
*解析json字符串并返回一个List
*/
    public static List<News>  parseJSON(InputStream in){List<News> list = null;
        try {list = new ArrayList<>();
//           String str = StreamTool.streamToString(in);
//            System.out.println(str);
            byte[] bytes = StreamTool.stream2Byte(in);//这里用到了StreamTool工具类,自己到CSDN上下载一个,这里是把
                                                       //输入流转化为字节数组
             String str = new String (bytes,"GBK");//因为服务器设置了返回编码为GBK,这里也设置编码方式为GBK
            System.out.println("解析成功"+str);
            JSONArray jsonArray = new JSONArray(str);//将json字符串转化为JSONArray
            for(int i =0;i< jsonArray.length();i++){JSONObject jsonObject = jsonArray.getJSONObject(i);//循环JSONArray获得每一个JSONObject对象
                int id = jsonObject.getInt("id");
                String title = jsonObject.getString("title");
                int timelength = jsonObject.getInt("timelength");
                list.add(new News(id,title,timelength));
            }} catch (IOException e) {e.printStackTrace();
            Log.e("io","输入流读取错误");
        } catch (JSONException e) {e.printStackTrace();
            Log.e("json","json数组转换错误");
        } catch (Exception e) {e.printStackTrace();
        }return list;
    }
}

    (3)MainActivity类
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class MainActivity extends AppCompatActivity implements Runnable {List<HashMap<String,Object>> data;
    private static final int TAG =0X1;//用于Handler中的异步处理标志
    Thread thread = null;//声明线程,用于执行NewsServer中的网络访问
    Handler handler = new Handler() {@Override
        public void handleMessage(Message msg) {super.handleMessage(msg);
            switch (msg.what){case TAG:SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this,data,R.layout.item,new String[]{"title","timelength"},new int[]{R.id.title,R.id.timelength});
                    listview.setAdapter(simpleAdapter);
                    break;
            }}};

    @BindView(R.id.btn_refresh)Button btnRefresh;
    @BindView(R.id.listview)ListView listview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);//这里使用了ButterKnife组件来初始化组件和绑定id,不懂得自行百度
    }@OnClick(R.id.btn_refresh)public void onClick(View view) {switch (view.getId()) {case R.id.btn_refresh:thread = new Thread(this);
                thread.start();
                break;
        }}@Override
    public void run() {String length = getResources().getString(R.string.timelength);
        List<News> news = NewsService.getJsonLastNews();//这里必须另起一个线程访问,不能在主线程中访问
         data = new ArrayList<>();
        for(News news1:news){HashMap<String,Object> item  = new HashMap<>();
            item.put("id",news1.getId());
            item.put("title",news1.getTitile());
            item.put("timelength",length+": "+news1.getTimelength());
            data.add(item);
        }Message msg = new Message();
        msg.what=TAG;
        handler.sendMessage(msg);//通知组件更新界面
    }
}

三、后记
      作为一只菜鸟不得不承认在这次练习中,犯了不少低级错误,比如,服务器端,没有设置返回的编码方式,json字符串忘记加“ ”;在客户端,在非UI线程中更新UI组件,在解析json时没有设置编码方式,在设置请求方式时将GET写成Get,哎,吃一堑长一智。

android客户端+JAVA WEB服务器实现json数据解析相关推荐

  1. Java调用接口获取json数据解析后保存到数据库

    文章目录 1.在yml文件中配置自己定义的接口URL 2.在Controller中添加请求方法和路径 3.在Service中添加方法 4.在ServiceImpl中实现方法 今天给大家带来一个调用接口 ...

  2. 利用Http在Android客户端与Web服务器之间断点续传中大文件

    一.还是先说一下需要用到的工具: 1.服务端:IDEA(真的超好用).Tomcat 2.客户端:Android 二.上代码 服务端代码: import net.sf.json.JSONArray; i ...

  3. javaweb中服务器响应,Java Web服务器响应与JSON

    我想创建一个简单的Java Web应用程序响应GET请求/用JSON字符串测试.Java Web服务器响应与JSON 我的环境是Java,Intellij和Tomcat 8.5.4. 到目前为止,我有 ...

  4. Android JSON数据解析(GSON方式)

    要创建和解析JSON数据,也可以使用GSON来完成.GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库.使用GSON,可以很容易的将一串JSON数据转换为一个Jav ...

  5. java中怎么使用json数据_JAVA中使用JSON进行数据传递

    1.是不是只有xml传递数据的技术才是webservice? 可以这么理解.webservice是基于SOAP协议,SOAP协议是基于XML的文本协议.所以webservice可以简单理解为是基于XM ...

  6. Android学习笔记44:JSON数据解析

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. 本文将主要介绍在Android ...

  7. 客户端Mock服务端的JSON数据

    http://hlyu.cn/?p=392 http://hlyu.cn/?p=392 http://hlyu.cn/?p=392 客户端Mock服务端的JSON数据 场景1:服务端和客户端已经制定了 ...

  8. java数组里套数组_用JAVA进行Json数据解析(对象数组的相互嵌套)

    这段时间我们在做一个英语翻译软件的小小小APP,涉及到了对Json数据的解析,所以特地来总结一下! 假设我们要对如下数据进行解析,其实在平时,返回的Json数据是很乱的,很难分清数据的关系,这是经过相 ...

  9. AndServer,一个Android端的web服务器

    版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com 大家好,今天跟大家介绍一个让原生Android也可以做Web开发的开源项目--AndServer. 开 ...

最新文章

  1. php json_encode中提示的中文总是返回\u767b\u5f55\u6210\u529f\uff01的解决办法
  2. pycharm如何折叠指定代码而不是某一个函数或类或功能块
  3. 创业公司产品经理如何画好原型图
  4. RocketMQ消息支持的模式-消息同步发送
  5. css图片等比例裁剪
  6. WCF学习之旅—第三个示例之四(三十)
  7. spark学习-62-Spark:Yarn-cluster和Yarn-client区别与联系
  8. JAVA遍历map元素
  9. 中国双重增亮膜(DBEF)市场趋势报告、技术动态创新及市场预测
  10. 微信小程序下载pdf到本地的坑
  11. 翻译润色、论文英语修改、语法建议、3个软件-研究生必用
  12. day02 python基础
  13. 滴滴天使投资人的25条创业建议
  14. Rhino6.25软件安装教程|兼容WIN10
  15. 1894 Beckham’s Freekick
  16. 对标阿里P7Android最全面试题合集(GitHub、掘金高赞收集)
  17. (四)国产数据库-达梦DCA实操(创建用户、权限)
  18. TC397 LIN Master 用例
  19. 前置自增加++与后置自增加++区别,前后自减同理
  20. 阿里校园招聘前端面试

热门文章

  1. 【Overload游戏引擎】源码分析之六:OvRendering函数库(四)
  2. DVWA详细安装教程
  3. 学python学了一年,都做了啥东西
  4. 请用python编写一个斗地主小游戏,并给出完整代码
  5. 【我不熟悉的javascript】判断字符串数组内容是否相等的方法,不考虑顺序
  6. C语言实现井字棋游戏(含算法优化)
  7. MongoDB快速上手
  8. 如何提臀(瑜伽提臀方法)
  9. 【VScode使用指南】全局搜索屏蔽指定文件类型及文件夹
  10. 计算机毕设Node.js+Vue游戏盒子系统(程序+LW+部署)