Json невозможно проанализировать результат copyManager - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь экспортировать таблицы из моей Postgres базы данных в json файлы, все работает нормально, когда я просто использую select row_to_json(t) from (SELECT * from tableName) t;, но для таблиц, в которых они имеют более 1,6 миллиона строк, Postgres показывает исключение из-за нехватки памяти.Поэтому лучшее решение, которое я нашел, - это работать с copyManager и копировать результат непосредственно в файл json, используя этот sql оператор COPY (select row_to_json(t) from (SELECT * from tableName) t) to STDOUT ;, моя проблема в том, что у меня есть некоторые данные с двойными кавычками при использовании нормальный ВЫБОР Я получаю свой файл json правильно и "похожи на \", но при использовании КОПИРОВАНИЯ "похожи на \\" или с этим у меня возникают проблемы с синтаксическим анализом JSON, потому что это больше не действительный json ниже это мой код

        FileWriter fileWriter = new FileWriter("C:/" + tableName + ".json");
        CopyManager copyManager = new CopyManager(db.getConnection().unwrap(BaseConnection.class));
        String sql = "COPY (select row_to_json(t) from (SELECT  *  from " + tableName
                + ") t) to  STDOUT ;";
        try {
            copyManager.copyOut(sql, fileWriter);
        }
        catch (Exception e) {
            log.error(e);
        } finally {
            fileWriter.close();
        }

ошибка при синтаксическом анализе Internal error:org.json.simple.parser.ParseException error Unexpected character (f) at position 127., и если мы посмотрим на эту позицию, мы обнаружили

"street":"street name \\"first test\\"" 

, и это не действительный json, который я можно проанализировать его или использовать select row_to_json(t) from (SELECT * from tableName) t; Я получаю это

"street":"street name \"first test\""

, и он отлично работает, так как я могу это исправить, или если есть другие методы для экспорта огромных таблиц в файлы json, спасибо

это пр код, который работает:

PrintWriter printWriter = new PrintWriter(fileWriter);
String sql = "select row_to_json(t) from (SELECT  " + columns + "  from " + tableName + ") t) ";
try(Connection con = db.getConnection()){
         try (PreparedStatement stmt = SQL.prepareStatement(db, con, sql);
             ResultSet rs = stmt.executeQuery()) {
            while (rs.next()) {
                printWriter.print(rs.getString(1));
            }
            stmt.close();
              }
         printWriter.close();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...