簡體   English   中英

如何從數據庫中檢測JSON列類型

[英]How to detect JSON column type from Database

有一些代碼可以將數據庫ResultSet轉換為JSON。 現在,它可以處理數字值和字符串,並且效果很好。 但是,當它獲取JSON值時,會在其上使用toString ,而不是將其視為JSON,這意味着提取時,它已轉義了雙引號等,並且無法重新序列化為JSON。

如何從PostgreSQL數據庫中檢測JSON列類型?

編輯:這是@ f1sh建議的解決方案。 @ f1sh,如果要提交評論作為答案,我會將其標記為已接受的解決方案。

private JsonNode resultSetToJson(ResultSet rs) throws SQLException {

    ObjectNode node = DataFileTool.OBJECT_MAPPER.createObjectNode();

    ResultSetMetaData mData = rs.getMetaData();
    int columnCount = mData.getColumnCount();

    for (int i = 1; i <= columnCount; i++) {

        Object obj = rs.getObject(i);
        String columnName = mData.getColumnLabel(i);
        String columnNameToUse = dbColumnNameToJsonKey.containsKey(columnName)
                ? dbColumnNameToJsonKey.get(columnName) : columnName;

        if (mData.getColumnType(i) == Types.NUMERIC) {
            if (obj == null) {
                node.putNull(columnNameToUse);
            } else if (obj instanceof BigDecimal) {
                node.put(columnNameToUse, (BigDecimal) obj);
            } else if (obj instanceof Integer) {
                node.put(columnNameToUse, (Integer) obj);
            } else if (obj instanceof Double) {
                node.put(columnNameToUse, (Double) obj);
            } else if (obj instanceof Long) {
                node.put(columnNameToUse, (Long) obj);
            } else if (obj instanceof Float) {
                node.put(columnNameToUse, (Float) obj);
            } else if (obj instanceof Short) {
                node.put(columnNameToUse, (Short) obj);
            } else if (obj instanceof BigInteger) {
                node.set(columnNameToUse, BigIntegerNode.valueOf((BigInteger) obj));
            } else if (obj instanceof Byte) {
                node.put(columnNameToUse, (Byte) obj);
            } else {
                node.put(columnNameToUse, obj.toString());
            }
        } else if (obj instanceof PGobject) {
            PGobject pg = (PGobject) obj;

            if (pg.getType().equalsIgnoreCase("json")) {
                JsonNode pgNode;

                try {
                    pgNode = DataFileTool.OBJECT_MAPPER.readTree(pg.getValue());
                    node.set(columnNameToUse, pgNode);
                } catch (IOException e) {
                    LOGGER.error("An exception occurred while attempting to parse JSON PGObject to JsonNode: {}",
                            obj, e);
                    node.put(columnNameToUse, obj.toString());
                }
            } else {
                node.put(columnNameToUse, obj.toString());
            }
        } else if (obj == null) {
            node.put(columnNameToUse, StringUtils.EMPTY);
        } else {
            node.put(columnNameToUse, obj.toString());
        }
    }

    return node;
}
if (obj instanceof PGobject) {
        PGobject pg = (PGobject) obj;

        if (pg.getType().equalsIgnoreCase("json")) {
            JsonNode pgNode;

            try {
                pgNode = DataFileTool.OBJECT_MAPPER.readTree(pg.getValue());
                node.set(columnNameToUse, pgNode);
            } catch (IOException e) {
                LOGGER.error("An exception occurred while attempting to parse JSON PGObject to JsonNode: {}",
                        obj, e);
                node.put(columnNameToUse, obj.toString());
            }
        } else {
            node.put(columnNameToUse, obj.toString());
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM