在数据库而不是java中生成json文件

Posted

技术标签:

【中文标题】在数据库而不是java中生成json文件【英文标题】:Generating json file in database instead of java 【发布时间】:2020-08-23 16:50:13 【问题描述】:

我正在使用resultset 从数据库中读取一个table。后来我用这个数据来生成json文件。

我想在数据库中生成json 文件并将该文件返回给java,因为我的java 代码将使用POST API.

代码是这样的

    String query="select * from dynamicentitygtt";
    PreparedStatement prepstatement=connection.prepareStatement(query);
    ResultSet rs=prepstatement.executeQuery()
        while rs.next()
        
          //Load data to POJO
            
        
      //call method to generate json file.
      //Inject file data to API

我想要什么。

String query="select * from dynamicentitygtt";
        PreparedStatement prepstatement=connection.prepareStatement(query);
        ResultSet rs=prepstatement.executeQuery()
        //here I want file from database.

我的数据库应该返回 json 文件。我可以在数据库中创建程序。我也可以使用可调用的。我也可以从表中创建 json 文件。 但我不知道如何从数据库返回文件。

如果我的理解不正确,请见谅。

【问题讨论】:

您可以创建一个 pl/sql 过程来执行查询并返回包含所需 json 的 clob(并从 Java 调用该过程)。根据您的 Oracle 版本和您的偏好,至少有两种选择。我个人使用github.com/pljson/pljson,但如果您有 Oracle 18 或更高版本,您可能可以使用本机 JSON 方法。 “我不知道如何从数据库中返回文件” 完美 - 确定了您需要帮助的真正问题。阅读有关UTL_FILE 包的信息,或者 - 更一般地 - 使用您熟悉的任何方法从 Oracle 数据库中阅读有关文件操作的信息。这与文件的内容(JSON 或其他)无关。 @mathguy 非常感谢 mathguy。我正在经历同样的事情。 您应该在此类问题中包含 Oracle 的版本。更高版本的数据库具有增强的功能。 我正在使用 oracle 18c。 【参考方案1】:

由于您注意到您使用的是 Oracle 18c,因此您可以访问 JSON_OBJECT, JSON_OBJECTAGG, JSON_ARRAY, and JSON_ARRAYAGG SQL 函数。使用这些函数,您应该能够只使用 SQL 查询创建所需的 JSON 结构,而无需生成文件并将其传递回 Java 调用。需要注意的一点是,如果您要生成大型 JSON 对象,则需要修改查询中任何 JSON 函数调用中的 RETURNING 子句,否则您的 JSON 将无效。

以下是有关如何使用这些功能的一些示例:

查询 #1

WITH
    emp (employee_id,
         first_name,
         last_name,
         department_number)
    AS
        (SELECT 1, 'John', 'Doe', 100 FROM DUAL
         UNION ALL
         SELECT 2, 'Jane', 'Smith', 100 FROM DUAL
         UNION ALL
         SELECT 3, 'Robert', 'Jones', 200 FROM DUAL
         UNION ALL
         SELECT 4, 'Alan', 'Carter', 300 FROM DUAL)
SELECT json_arrayagg (json_object (*))
  FROM emp;

结果 #1(美化)

[
  
    "EMPLOYEE_ID": 1,
    "FIRST_NAME": "John",
    "LAST_NAME": "Doe",
    "DEPARTMENT_NUMBER": 100
  ,
  
    "EMPLOYEE_ID": 2,
    "FIRST_NAME": "Jane",
    "LAST_NAME": "Smith",
    "DEPARTMENT_NUMBER": 100
  ,
  
    "EMPLOYEE_ID": 3,
    "FIRST_NAME": "Robert",
    "LAST_NAME": "Jones",
    "DEPARTMENT_NUMBER": 200
  ,
  
    "EMPLOYEE_ID": 4,
    "FIRST_NAME": "Alan",
    "LAST_NAME": "Carter",
    "DEPARTMENT_NUMBER": 300
  
]

查询 #2

WITH
    emp (employee_id,
         first_name,
         last_name,
         department_number)
    AS
        (SELECT 1, 'John', 'Doe', 100 FROM DUAL
         UNION ALL
         SELECT 2, 'Jane', 'Smith', 100 FROM DUAL
         UNION ALL
         SELECT 3, 'Robert', 'Jones', 200 FROM DUAL
         UNION ALL
         SELECT 4, 'Alan', 'Carter', 300 FROM DUAL)
  SELECT json_arrayagg (
             json_object (
                     'department_number' VALUE department_number,
                     'employees' VALUE
                         json_arrayagg (
                             json_object ('first_name' VALUE first_name, 'last_name' VALUE last_name))))
    FROM emp
GROUP BY department_number;

结果 #2(美化)

[
  
    "department_number": 100,
    "employees": [
       "first_name": "John", "last_name": "Doe" ,
       "first_name": "Jane", "last_name": "Smith" 
    ]
  ,
  
    "department_number": 200,
    "employees": [ "first_name": "Robert", "last_name": "Jones" ]
  ,
  
    "department_number": 300,
    "employees": [ "first_name": "Alan", "last_name": "Carter" ]
  
]

【讨论】:

【参考方案2】:

在 java 中使用下面的方法可以创建 Map 列表。

其中 Map 具有 columnName 的键和值作为该列的值。

public List<Map<String, String>> getList(ResultSet resultSet) throws SQLException 
        List<Map<String, String>> mapList = new ArrayList<>();
        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
        int columnNumber = resultSetMetaData.getColumnCount();
        while (resultSet.next()) 
            Map<String, String> map = new HashMap<>();
            int count = 1;
            while (count <= columnNumber) 
                String columnName = resultSetMetaData.getColumnName(count);
                map.put(columnName, resultSet.getString(columnName));
                count++;
            
            mapList.add(map);
        
        return mapList;
    

一旦您能够创建 Map,您就可以使用多个库 like this 从中创建任何 json 字符串或 json 对象

这会对你有所帮助。

【讨论】:

OP 想要在 db 中而不是在 Java 中生成 json。那么战争你建议用 Java 做一个代码吗?

以上是关于在数据库而不是java中生成json文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用/引用在同一个 json 模式中生成的字段值

Servlet中生成json文件,echarts模板调用

解决Java中生成二级菜单栏JSON数据格式

如何在 dist 目录中生成单独的 package.json 文件?

在 node.js 中生成的 JWT(JSON Web Token) 未在 java 中验证

试图通过管道将 C 中生成的数据传递给 Java 类。传递变量在java中出现空白而不是有数据