【问题标题】:Create json file from SQL Table, then be able to query the file从 SQL 表创建 json 文件,然后可以查询该文件
【发布时间】:2020-10-28 20:24:03
【问题描述】:

我正在尝试完成以下任务(使用 Netbeans 11.3):

1.) 从 SQL 表的列中获取数据(字符串)。

2.) 使用 Filewriter 将数据转换并保存为 JSONArray。

3.) 查询新创建的 JSON 文件 (output.json),以便将数据用于填充文本框。

我已经完成(我认为)1 和 2;但我坚持如何保存 output.json 文件,以便可以访问和查询它。作为旁注,根据我的研究,我认为有更好的方法来完成这些任务(在我看来,.php 比 Java 更适合这些任务),但作为一种学习体验,我想尝试完成这个任务。

代码如下:

DatabasetoJSONScript.JS

import java.io.FileWriter; 
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;


public class DataBaseToJSon {

public static ResultSet RetrieveData() throws Exception {

    String host = "jdbc:derby://localhost:1527/dbname";
    String uName = "my Uname";
    String uPass = "my Pass";
    
    Connection con = DriverManager.getConnection(host, uName, uPass);
    Statement stmt = con.createStatement();
    

    ResultSet rs = stmt.executeQuery ("Select * from Table_Name");
    
    return rs;
}        

 public static void main (String args[])throws Exception {
                       
            JSONObject jsonObject = new JSONObject();
            JSONArray array = new JSONArray();
     
            ResultSet rs = RetrieveData();
            
            while (rs.next()) {
            
            JSONObject record = new JSONObject();
                record.put("TEXT", rs.getString("TEXT"));
                record.put("ANSWER", rs.getString("ANSWER"));
                array.add(record);
            }         
            jsonObject.put("RC1", array);
            
            try {
                try (FileWriter file = new FileWriter ("C:\\Users\\Owner\\Documents\\NetBeansProjects
                    \\HTML5Application\\public_html")) {
                    file.write (jsonObject.toJSONString());
                }
            } catch(IOException e){
            System.out.println("JSON flie created....");
         }
    }           

controller.js 的相关部分

$(document).ready(function (){
    var questionBank=new Array;
    var currentQuestionNumber; 
    var currentAnswer;
    var numberOfQuestions;
    var gamePosition;
    var score;

 $.getJSON('output.json', function(output) {
   numberOfQuestions=output.RC1.length;
       for(i=0;i<output.RC1.length;i++){
           typeArray=[];
           typeArray[1]=output.RC1[i].TEXT;
           typeArray[0]=output.RC1[i].ANSWER;
           questionBank[i]=typeArray;
    }
 

【问题讨论】:

  • 你能发布你的示例 json 吗?

标签: java sql json filewriter


【解决方案1】:

您可以使用JSONParser 将文件内容解析为JSON,然后根据您的格式将其转换为JSONObject 或JSONArray。

    //JSON parser object to parse read file
    JSONParser jsonParser = new JSONParser();

    try (FileReader reader = new FileReader("/opt/MyWork/output.json")) {
        //Read JSON file
        Object obj = jsonParser.parse(reader);

        JSONObject jobj = (JSONObject) obj;
        JSONArray arr = (JSONArray) jobj.get("RC1");
        
        for(Object r : arr){
            JSONObject record = (JSONObject) r;
            System.out.println(record.get("TEXT"));
        }

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

【讨论】:

    【解决方案2】:

    将 JDBC 结果集转换为 JSON 对象数组的任务是一项相当重复的任务,即使它对所有可能的结果集都以相同的方式工作。如果可以选择使用第三方库,jOOQ and its SQL/JSON support might be of help。有两种选择:

    使用 jOOQ 的客户端 JSON 格式化能力

    这甚至适用于您的 JDBC ResultSet,因此您不需要使用 jOOQ 来创建查询,尽管您当然可以:

    String json = DSL.using(con)
        .fetch(RetrieveData())
        .formatJSON(new JSONFormat().header(false).recordFormat(RecordFormat.OBJECT));
    

    还有其他方法可以格式化您的 JSON 输出,see also the manual about exporting JSON

    使用数据库的 SQL/JSON 支持

    在标准 SQL 中,你总是可以这样写:

    select json_arrayagg(json_object(
      key 'col1' value col1,
      key 'col2' value col2
    ))
    from t;
    

    这将直接在您的数据库中生成一个 JSON 文档。实际语法变化很大,因此您必须调整您的查询,或者您可以再次使用 jOOQ 为您抽象:

    JSON json = ctx
        .select(jsonArrayAgg(jsonObject(
           key("col1").value(T.COL1),
           key("col2").value(T.COL2)
        )))
        .from(T)
        .fetchOne()
        .value1();
    

    免责声明:我为 jOOQ 背后的公司工作。

    【讨论】:

      猜你喜欢
      • 2018-08-13
      • 2021-06-10
      • 2021-09-20
      • 1970-01-01
      • 2022-08-14
      • 2013-09-11
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      相关资源
      最近更新 更多