首页 > 代码库 > json
json
1、叉叉哥的代码resultSetToJson:
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方法;
2、cnblogs虾米工作室
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);
结果报错。
Try1、考虑将resultSet类型转化为List或者数组类型 ;
此文(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和叉叉哥代码基本一样,但调用这些函数,输出都是空;
Try2、有可能是数据集rs处理之后就再次处理为空,所以在前面将rs赋值给rs_replication;
数据库输出之后紧跟着这两句
JSONArray jsonArray = JSONArray.fromObject(extractJSONArray(rs_replication));
System.out.println("jsonArray\n"+jsonArray);
结果输出还是空。。
Try3、将方法1中代码插入到数据库输出中间
输出
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); }
Try4、每次输出为空是rs的问题
//创建副本
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 = http://www.mamicode.com/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":"天体"}
Try5、试试转化为数组
(http://weihuarongkitty.blog.163.com/blog/static/178533162006615211500/),将数据集内容逐条赋给二维数据应该不难。
占位