将数据库中读到的ResultSet类型数据转换为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);

结果报错,fromObject不是给数据集用的。

no zuo no die why i Try——>

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_replication;

有可能是数据集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、在for循环之后将jsonObj添加到jsonArray中

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这一项;

Try5.1、换一个数据库表

读取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"},【以下略

这初步实现了所需要的效果。

Try6、试试转化为数组

(http://weihuarongkitty.blog.163.com/blog/static/178533162006615211500/),将数据集内容逐条赋给二维数据应该不难。

占位

 

 

 

你可能感兴趣的:(将数据库中读到的ResultSet类型数据转换为json类型)