Android 解析json数据

2023-11-17

    花了两天的时间完成了一个简单的小程序:服务器端从数据库封装json 数据,客户端解析json数据后用listview 显示,现在做一个简单的梳理。

一、服务器端从数据库中获取数据后封装成json数据:(服务器端编程)

     连接数据库的过程就不上代码了,基本过程为:

     加入数据库的驱动——>DriverManager.getConnection()——>封装sql语句在perparedStatement对象中(具体看具体实例的要求,可以查看api)——>执行perparedSatatement对象,返回ResultSet对象。

    1.使用Java 反射机制将获得ResultSet数据放进List<T>,其中T是封装数据的类,放一个主要操作的代码:

       这一条是根据我的需求写的,查询单条或增删操作也可以仿照这里,写齐了就是不错的数据库操作的工具类。

//泛型编程,通过反射机制查询多条数据
	public <T> List<T> FindMoreData2(String sql,List<Object> params,Class<T> cls)throws Exception{
		List<T> list=new ArrayList<T>();
		ptmt=conn.prepareStatement(sql);
		int index=1;
		if(params!=null&&!params.isEmpty()){
		  for(int i=0;i<params.size();i++){
			  ptmt.setObject(index++,params.get(i));
		  }
		}
		resultSet=ptmt.executeQuery();
		ResultSetMetaData rData=resultSet.getMetaData();
		int col_num=rData.getColumnCount();
		while(resultSet.next()){
			T resultObject=cls.newInstance();
		for(int i=1;i<col_num;i++){
			String col_name=rData.getColumnName(i+1);
			Object col_value=resultSet.getObject(col_name);
			if(col_value==null) col_value="";
			<span style="color:#ff0000;">Field field=cls.getDeclaredField(col_name);//根据类名找到domain 类 中的属性
			field.setAccessible(true);
			field.set(resultObject, col_value);</span>
		}
		list.add(resultObject);
		}
		return list;
	}
 2.反射机制注意要写一个可序列化的封装类,数据库表中的列名与成员变量相对应,这样方便进行封装操作。我使用的数据库中表如下,数据比较粗糙。


News.java如下,getter和setter 方法省略:

public class News implements Serializable {
	private String iconUrl;
	private String title;
	private String content;
	public News(String iconUrl, String title, String content) {
		super();
		this.iconUrl = iconUrl;
		this.title = title;
		this.content = content;
	}

3.通过JsonObject方法封装成json数据,并以字符串的方式返回:

public static String createJsonString(String key,Object value){
		//String jsonString=null;
		JSONObject jsonobject=new JSONObject();
		jsonobject.put(key, value);
		return jsonobject.toString();
	}
JsonObject方法可以去查看api。

4.建立一个servlert,在dopost()方法中调用createJsonString("News",list);

"News"类似于数组名一样的存在,在客户端需要根据它来获得数据;list 是我们通过查询数据库获得的数据封装成的List<News>.


二、客户端从网络获取数据并显示在listview中(Android编程)

1.从网络上获取数据的话,应该使用异步加载的方式,Android的单线程模式决定了耗时操作不能放在主线程中完成,避免阻塞主线程(一般是UI线程),出现ANR错误。

AsyncTask之前有做过整理,这里就不重复写了。

2.在AsyncTask中写在doInBackGround()中的主要的Json解析操作:

private List<NewsBean> getJsonData(String url) {//根据inputstream获取json格式的字符串
        List<NewsBean> list=new ArrayList<>();
        try {
            String jsonstring=readStream(new URL(url).openStream());
            JSONObject jsonObject;
            
            NewsBean bean;
            try {
                jsonObject=new JSONObject(jsonstring);
                JSONArray jsonArray=jsonObject.getJSONArray("persons");//这里要注意
                for(int i=0;i<jsonArray.length();i++){
                    jsonObject=jsonArray.getJSONObject(i);
                    bean=new NewsBean();
                    bean.setNewsiconurl(jsonObject.getString("iconUrl"));//这里重写一遍
                    bean.setNewscontent(jsonObject.getString("content"));
                    bean.setNewstitle(jsonObject.getString("title"));
                    list.add(bean);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return list;
    }


private String readStream(InputStream is){
        InputStreamReader isr;
        String result="";
        try {
            String line="";
            isr=new InputStreamReader(is,"utf-8");
            BufferedReader br=new BufferedReader(isr);
            try {
                while((line=br.readLine())!=null){
                    result+=line;

                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return result;

    }


上面的new URL(url).openStream()的操作就类似于:new URL(url).openConnection().getInputStream(),实现联网,并且返回inputstream.

readstream()函数是将输入的inputStream 按照utf-8的编码方式转换成字符串。

3.适配器NewsAdapter

public class NewsAdapter extends BaseAdapter implements AbsListView.OnScrollListener{
    private List<NewsBean> mlist;
    private LayoutInflater mlayoutInflater;
    private ImageLoader imageLoader;//保证不出现多个cache
    private int mStart,mEnd;//
    public static String[] Urls;
    private boolean mFirst;//用来判断是否是第一次启动

    public NewsAdapter(Context context, List<NewsBean> data,ListView listView) {
        mlist = data;
        mlayoutInflater = LayoutInflater.from(context);
        imageLoader=new ImageLoader(listView);
        Urls=new String[data.size()];//创建数组,这里要加强练习
        for (int i = 0; i < data.size(); i++) {
            Urls[i]=data.get(i).getNewsiconurl();
        }
        mFirst=true;//第一次启动
        listView.setOnScrollListener(this);//实现了监听器,一定要记得注册

    }

    @Override
    public int getCount() {
        return mlist.size();
    }

    @Override
    public Object getItem(int position) {
        return mlist.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
           ViewHolder viewHolder=null;
           if(convertView==null){
               viewHolder=new ViewHolder();
               convertView=mlayoutInflater.inflate(R.layout.item,null);
               viewHolder.im= (ImageView) convertView.findViewById(R.id.im_icon);
               viewHolder.title= (TextView) convertView.findViewById(R.id.tv_title);
               viewHolder.content= (TextView) convertView.findViewById(R.id.tv_content);
               convertView.setTag(viewHolder);
           }
        else{
               viewHolder= (ViewHolder) convertView.getTag();
           }
         viewHolder.im.setImageResource(R.mipmap.ic_launcher);
         viewHolder.im.setTag(mlist.get(position).getNewsiconurl());//item图片出现错乱的原因是,list正确的item没有对应正确的url
        imageLoader.ShowImageByAsyncask(viewHolder.im,mlist.get(position).getNewsiconurl());
         viewHolder.content.setText(mlist.get(position).getNewscontent());
         viewHolder.title.setText(mlist.get(position).getNewstitle());
           return convertView;
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        if(scrollState==SCROLL_STATE_IDLE){
            //没有滚动项,开始加载
            imageLoader.LoadImages(mStart,mEnd);//没有进行预加载
        }else{
            //停止加载
            imageLoader.CancelAllTask();
        }

    }

    /**
     *
     * @param view 可见视图
     * @param firstVisibleItem 第一个可见元素
     * @param visibleItemCount 可见元素数目
     * @param totalItemCount list 中的总数
     */
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        mStart=firstVisibleItem;
        mEnd=firstVisibleItem+visibleItemCount;
        if(mFirst&&visibleItemCount>0){//当前列表第一次启动而且item已经绘出
            imageLoader.LoadImages(mStart,mEnd);
            mFirst=false;
        }

    }

    class ViewHolder{//这是类,不要再加括号了!!!!
        public TextView title,content;
        public ImageView im;

    }
}

4.因为需要根据URL获得服务器上的图片,另外再开一个线程去加载图片很重要,ImageLoader类中写了使用AsyncTask 的方法加载图片,并且更新了传递进来的imageview:

放一个根据url 获取图片的方法:

public Bitmap BitmapFromUrl(String url){
        Bitmap bm=null;
        InputStream is=null;
        try {
            HttpURLConnection hcn= (HttpURLConnection) new URL(url).openConnection();
            is=new BufferedInputStream(hcn.getInputStream());
            bm= BitmapFactory.decodeStream(is);

            hcn.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return bm;
    }
还有一些小的细节换一篇文章写一下。




     

     

  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 解析json数据 的相关文章

随机推荐

  • 整理最全的图床集合——三千图床

    2021 09 25 更新 去除部分图床 添加新的图床 优化排版 引言 古有弱水三千 今有三千图床 勿埋我心 图床一般是指储存图片的服务器 有国内和国外之分 国外的图床由于有空间距离等因素决定访问速度很慢影响图片显示速度 国内也分为单线空间
  • remote: HTTP Basic: Access deniedfatal: Authentication failed for ‘xxxxx‘的问题解决

    在没有修改git密码的情况下 使用vs code推送代码 总是会报错 remote HTTP Basic Access denied fatal Authentication failed for xxxxxxxx git仓库地址 网上试了
  • YOLOV7开源代码讲解--训练参数解释

    目录 训练参数说明 weights cfg data hpy epoch batch size img size rect resume nosave notest noautoanchor evolve bucket cach image
  • 【Basis】狄利克雷分布

    初次看狄利克雷分布 比较懵 主要是它有很多先行知识 所以我先介绍狄利克雷分布用到的多项式分布 gamma 函数 beta分布 然后再介绍狄利克雷分布 参考文献见文章末 目录 一 多项式分布 multinomial distribution
  • 仅仅是一张照片就是不能刷脸支付的

    科技改变未来并不是一句口号 就拿买东西来讲 以前人们都是一手交钱一手交货 拿到大额的纸币 还要验真假 而现在移动支付成为主要付款方式 只要一部手机 扫一扫就能付款 一开始也有很多人不习惯手机支付 因为觉得没有现金实在 整天就是一堆数字转来转
  • 解决TypeError: 'function' object is not subscriptable

    一 解决问题 在tensorflow中使用零矩阵初始化变量的时候出现的该异常 TypeError function object is not subscriptable 二 解决方法 问题代码如下 bias tf Variable tf
  • 深度学习(9):Inception危险物品检测

    目标 基于Inception网络实现对危险物品检测 将危险物品图片或视频经过图像预处理后输入模型推理 最后将检测结果进行可视化输出 一 原理 Google的Inception网络介绍 Inception为Google开源的CNN模型 至今已
  • Java的变量

    1 Java 变量类型 答 在Java语言中 所有的变量在使用前必须声明 声明变量的基本格式如下 type identifier value identifier value 格式说明 type为Java数据类型 identifier是变量
  • Java实现生成csv文件并导入数据

    一 需求 下载列表 在没有过滤之前下载列表所有数据 点击过滤之后 下载过滤之后对数据 生成csv文件 二 思路 先根据条件 是否过滤了数据 筛选出数据 将数据导入csv文件 生成文件并返回 三 代码实现 1 controller层 文件下载
  • Gbase 8s存储结构简介及空间管理

    Gbase 8s实例可以创建多个dbspace 一个dbspace可以包含多个物理chunk 一个chunk分成多个连续扩展区extent 一个表或者索引占用的空间被称为一个tablespace 一个extent包含多个物理页page 其中
  • 利用多线程来实现一个简单的服务器,来实现处理多个用户的请求

    服务器来实现接受多个客户的请求 并且处理响应 服务器采用了多线程 代码如下服务器 package cn kgc basic tcpthread import java io IOException import java net Serve
  • BERT从零详细解读:如何微调BERT,提升BERT在下游任务中的效果

    a 是句子对的分类任务 b 是单个句子的分类任务 c 是问答任务 d 是序列标注任务 首先我自己最常用的就是 文本分类 序列标注和文本匹配 这四个都是比较简单的 我们来看d 序列标注 其实就是把所有的token输出 做了一个softmax
  • Blender学习笔记(建模#3:点操作)

    建模 3 点操作 点操作 1 点的移动 2 点的滑移 3 点的合并 4 点的倒角 5 顶点连接 点操作 1 点的移动 当要将点在斜面上移动时 直接移动很难顺着斜面移动 这时可以使用法向坐标系 2 点的滑移 基本同线的滑移 3 点的合并 两点
  • AngularJs 的compile, preLink , postlink

    AngularJs 的compile preLink postlink 主要参考文章 1 http www jb51 net article 58229 htm 文章中对这三个概念做了详细的解析 如果你只写了一个link 那么系统会默认是p
  • Burp Suit+Phpstudy+Pikachu搭建Web安全练习环境

    1 软件安全测试工具Burp Suit安装 1 1 社区版 进入官网 Download Burp Suite Community Edition PortSwigger 进行下载安装即可 1 2 专业版 搜索Burp Suit2 0 11从
  • 链表相交等相关问题java - 左神算法基础课04 - Kaiqisan

    大家好 都吃晚饭了吗 我是Kaiqisan 是一个已经走出社恐的一般生徒 今天讲讲我至今碰到的最变态的链表题 问题 单链表两个单链表可能有环 可能无环 判断两个链表是否存在相交 如果有相交 返回其中一个交点 要求 时间复杂度 O m n 空
  • 【计算机网络】湖科大微课堂笔记 p36-37 集线器与交换机的区别、以太网交换机自学习和转发帧的流程

    集线器与交换机的区别 集线器 共享型以太网 交换机 交换式以太网 早期与集线器 使用集线器HUB在物理层拓展以太网 下面是三个独立的以太网 可以用集线器把它们互联形成更大的以太网 若一系中的某主机向二系中某主机发送数据帧 则此信号会传遍整个
  • antd 4.x, 实现Table 可编辑 , Table 结合Form.List,实现单独校验Form.List、Form.Item校验

    背景 需要实现一个这种表格 思路 1 编辑表格 antd 有案例 2 Form List 嵌套Table 实现 关键点 单行校验怎么传参 单行如何获取值 单行如何重置 注意 我的form 是从外层传进来的 这个没有影响 正常在 Form L
  • gdb调试工具的基本用法

    一 基本命令 gcc g test c o test 编译时生成debug有关的程序信 gdb test 启动调试 help 查看命令帮助 具体命令查询在gdb中输入help 命令 简写h run 重新开始运行文件 run text 加载文
  • Android 解析json数据

    花了两天的时间完成了一个简单的小程序 服务器端从数据库封装json 数据 客户端解析json数据后用listview 显示 现在做一个简单的梳理 一 服务器端从数据库中获取数据后封装成json数据 服务器端编程 连接数据库的过程就不上代码了