1、叉叉哥的代码resultSetToJson:
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 = 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/),将数据集内容逐条赋给二维数据应该不难。
占位
原文:http://my.oschina.net/SnifferApache/blog/296090