Java数据库ResultSet转json实现
public String resultSetToJson(ResultSet rs) throws SQLException,JSONException { // json数组 JSONArray array = new JSONArray(); // 获取列数 ResultSetMetaData metaData = rs.getMetaData(); int columnCount = metaData.getColumnCount(); // 遍历ResultSet中的每条数据 while (rs.next()) { JSONObject jsonObj = new JSONObject(); // 遍历每一列 for (int i = 1; i <= columnCount; i++) { String columnName =metaData.getColumnLabel(i); String value = rs.getString(columnName); jsonObj.put(columnName, value); } array.put(jsonObj); } return array.toString(); }
修改前面博文提到的从数据库db0703中读取Student表中数据那个代码,调用resultSetToJson,将数据集rs传给这个方法,调试没错,运行:
代码流程如果是:
line1 调用resultSetToJson;
line2. 循环显示数据库中内容;
结果:什么都没有,line2也不会显示出内容;
如果是:
line2;
line1;
结果:line2正常输出,line1还是没内容,在resultSetToJson中加入printf测试一下,发现rs的长度是正常的,但是while (rs.next()) {}循环根本没有执行,不知怎么解释,遂不会了。。。
导入下文提到的多个jar包后,叉叉哥代码array.put(jsonObj);处提示无put方法;
http://www.cnblogs.com/xia520pi/archive/2012/05/22/2513369.html
我用其中student.java
public class Student { private String userName; private String sex; private int age; public Student() { } public Student(String userName, String sex, int age) { this.userName = userName; this.sex = sex; this.age = age; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
JsonLib.java
import java.util.ArrayList; import java.util.List; import net.sf.json.JSONArray; /* * json-lib包来源 * http://download.csdn.net/download/zyuc_wangxw/3742101 * */ public class JsonLib { public static void main(String args[]){ collections2json(); } public static void collections2json(){ List list1 = new ArrayList(); list1.add("first"); list1.add("second"); JSONArray jsonArray1 = JSONArray.fromObject(list1); System.out.println("List list1"); System.out.println(jsonArray1); List<Student> list2 = new ArrayList<Student>(); list2.add(new Student("xiapi1","男",10)); list2.add(new Student("xiapi2","女",11)); list2.add(new Student("xiapi3","男",12)); JSONArray jsonArray2 = JSONArray.fromObject(list2); System.out.println("List<Student> list2"); System.out.println(jsonArray2); } }
作者用了多个jar包,本想按部就班,但(官方网站:http://json-lib.sourceforge.net/)非常慢,看到评论说fastjar不错,便找到这个(http://download.csdn.net/detail/finaljia/5293875#comment)试试;
导入之后JSONArray.fromObject处提示(The method fromObject(List) is undefined for the type JSONArray),了解到百度知道网友使用json-lib.jar解决,遂重新找找json-lib.jar;
检索开始:
Mark1、fastjson 的简单使用 (http://blog.csdn.net/qiantujava/article/details/37522477),这篇不是我要的,前后文有(Android实现简单登录,mybatis简单使用),看来作者是“简单”系列的人,我也是;
Mark2、fastjson生成和解析json数据,此文逻辑非常清晰,涉及
(1. fastjson生成和解析json数据
(举例:4种常用类型:JavaBean,List<JavaBean>,List<String>,List<Map<String,Object>)
2.通过一个android程序测试fastjson的用法。),火候到了再回头看;
Mark3、此网页(http://www.sencha.com/forum/topics-remote.php)都是json文本,可能是用来测试的吧
检索结束;
发现目标(http://download.csdn.net/download/zyuc_wangxw/3742101),简直是太棒了,文件简介:
json-lib.rar:
Json开发所必需的jar包,以及关联的所以jar包。 列表为: 1)json-lib-2.3-jdk15.jar; 2)ezmorph-1.0.6.jar; 3)commons-logging-1.1.1.jar; 4)commons-lang-2.0.jar; 5)commons-collections-3.1.jar; 6)commons-beanutils.jar.
和虾米工作室所需jar包的完全匹配,全部导入,运行结果:
List list1
["first","second"]
List<Student> list2
[{"age":10,"sex":"男","userName":"xiapi1"},{"age":11,"sex":"女","userName":"xiapi2"},{"age":12,"sex":"男","userName":"xiapi3"}]
接下来就基于这个代码将数据集rs的内容转化为json格式,
直接使用
JSONArray jsonArray2 = JSONArray.fromObject(rs); System.out.println(jsonArray2);
结果报错,fromObject不是给数据集用的。
no zuo no die why i Try——>
此文(ResultSet转换为List的方法)提出多种方法将resultSet转化为其它类型
//方法1、ResultSet转换为List的方法 private static List convertList(ResultSet rs) throws SQLException { List list = new ArrayList(); ResultSetMetaData md = rs.getMetaData(); int columnCount = md.getColumnCount(); //Map rowData; System.out.println("convertList:"+columnCount); while (rs.next()) { //rowData = new HashMap(columnCount); Map rowData = new HashMap(); for (int i = 1; i <= columnCount; i++) { rowData.put(md.getColumnName(i), rs.getObject(i)); } list.add(rowData); } return list; } //方法2、返回list类型 /** * 通用取结果方案,返回list * * @param rs * @return * @throws SQLException */ public static List extractData(ResultSet rs) throws SQLException { ResultSetMetaData md = rs.getMetaData(); int num = md.getColumnCount(); List listOfRows = new ArrayList(); while (rs.next()) { Map mapOfColValues = new HashMap(num); for (int i = 1; i <= num; i++) { mapOfColValues.put(md.getColumnName(i), rs.getObject(i)); } listOfRows.add(mapOfColValues); } return listOfRows; } //方法3、返回JSONArray类型 public static JSONArray extractJSONArray(ResultSet rs) throws SQLException { ResultSetMetaData md = rs.getMetaData(); int num = md.getColumnCount(); JSONArray array = new JSONArray(); while (rs.next()) { JSONObject mapOfColValues = new JSONObject(); for (int i = 1; i <= num; i++) { mapOfColValues.put(md.getColumnName(i), rs.getObject(i)); } array.add(mapOfColValues); } return array; }
其中方法3和叉叉哥代码基本一样,但调用这些函数,输出都是空;
有可能是数据集rs处理之后就再次处理为空,所以在前面将rs赋值给rs_replication;
数据库输出之后紧跟着这两句
JSONArray jsonArray = JSONArray.fromObject(extractJSONArray(rs_replication));
System.out.println("jsonArray\n"+jsonArray);
结果输出还是空。。
输出
convertList:3
[{"name":"tom","ID":1}]
1 tom 计算机
[{"name":"tom","ID":1},{"name":"sheldon","ID":2}]
2 sheldon 物理
[{"name":"tom","ID":1},{"name":"sheldon","ID":2},{"name":"raj","ID":3}]
3 raj 天体
少了class这一列,rowData.put只能有两个参数
//初始化变量 int ID=-1; String name = null; String classname= null; // new add List list = new ArrayList(); ResultSetMetaData md = rs.getMetaData(); int columnCount = md.getColumnCount(); //Map rowData; System.out.println("convertList:"+columnCount); // new add //循环读取 while(rs.next()) { // new add Map rowData = new HashMap(); for (int i = 1; i <= columnCount; i++) { rowData.put(md.getColumnName(i), rs.getObject(i)); } list.add(rowData); JSONArray jsonArray = JSONArray.fromObject(list);//add System.out.println(jsonArray);//show result each time // new add // 读取3列数据 ID = rs.getInt("ID"); name=rs.getString("name"); classname=rs.getString("class"); //输出结果 System.out.println(ID + "\t" + name+"\t"+classname); }
//创建副本 ResultSet rs_replication =rs;
这两句没有创建新的resultset,类似指针一样指向的是同一个,所以回到Try2再试试;
// 遍历ResultSet中的每条数据 JSONObject jsonObj = new JSONObject(); while (rs.next()) { // 遍历每一列 for (int i = 1; i <= columnCount; i++) { String columnName =metaData.getColumnLabel(i); String value = rs.getString(columnName); jsonObj.put(columnName, value); System.out.println(jsonObj); }
输出
{"ID":"1"}
{"ID":"1","name":"tom"}
{"ID":"1","name":"tom","class":"计算机"}
{"ID":"2","name":"tom","class":"计算机"}
{"ID":"2","name":"sheldon","class":"计算机"}
{"ID":"2","name":"sheldon","class":"物理"}
{"ID":"3","name":"sheldon","class":"物理"}
{"ID":"3","name":"raj","class":"物理"}
{"ID":"3","name":"raj","class":"天体"}
JSONObject与JSONArray的使用以及JSONObject与JSONArray的使用
照着修改,每次for循环结束后执行
array.add(item++,jsonObj);//此处去掉第一个参数,效果完全一样
输出array:
[{"ID":"1","name":"tom"},{"ID":"2","name":"sheldon"},{"ID":"3","name":"raj"}]
额,为什么又没有class这一列?
代码:
while (rs.next()) { // 遍历每一列 for (int i = 1; i <= columnCount; i++) { String columnName =metaData.getColumnLabel(i); String value = rs.getString(columnName); jsonObj.put(columnName, value); } System.out.println(jsonObj); array.add(jsonObj); System.out.println(array); } System.out.println("#array:\n"+array);
输出:
{"ID":"1","name":"tom","class":"计算机"}
[{"ID":"1","name":"tom"}]
{"ID":"2","name":"sheldon","class":"物理"}
[{"ID":"1","name":"tom"},{"ID":"2","name":"sheldon"}]
{"ID":"3","name":"raj","class":"天体"}
[{"ID":"1","name":"tom"},{"ID":"2","name":"sheldon"},{"ID":"3","name":"raj"}]
#array:
[{"ID":"1","name":"tom"},{"ID":"2","name":"sheldon"},{"ID":"3","name":"raj"}]
这说明每次jsonObj的数据给到jsonArray后就丢了class这一项;
读取csfn_news中内容,输出:
#array:
[{"id":"1","title":"ceshi","URL":"http://www.baidu.com"},{"id":"2","title":"baidu","URL":"http://www.baidu.com"},{"id":"3","title":"青岛22人因生产有害食品获刑","URL":"http://www.cfsn.cn/news/content/2014-05/14/content_203870.htm"},{"id":"4","title":"广西查获120吨凤爪猪耳等洋垃圾","URL":"http://www.cfsn.cn/news/../2014-04/14/content_196202.htm"},{"id":"5","title":"臭豆腐用硫酸亚铁染色","URL":"http://www.cfsn.cn/news/content/2014-03/25/content_190367.htm"},{"id":"6","title":"深圳第二批食品安全“黑名单”近期曝光","URL":"http://www.cfsn.cn/news/../locality/shenzhen/img/2013-12/10/content_169986.htm"},【以下略】
这初步实现了所需要的效果。
(http://weihuarongkitty.blog.163.com/blog/static/178533162006615211500/),将数据集内容逐条赋给二维数据应该不难。
占位