插入\"用Qt转换成jsonb值

时间:2015-12-11 14:40:06

标签: c++ json postgresql qt

我有json编码的数据,可以采用以下格式: {" forumla":" callTo(\" par1 \",\" par2 \")"} 当我尝试将其插入带有jsonb列的postgresql表时,我收到以下错误:

SQL error QSqlError(-1, "QPSQL: Unable to create query", "ERROR:  invalid input syntax for type json
LINE 1: ...15-12-11 15:20:17.350', 21590, '{ "forumla...
                                           ^
DETAIL:  Token "par1" is invalid.
CONTEXT:  JSON data, line 1: ..." : "callTo(\\"par1...

")

似乎Qt以某种方式用转义的反斜杠和引号替换了转义引号(\")。通过psql cli插入字符串有效。 有人可以帮我这个吗?

提前致谢。

更新:
我删除了绑定并用一个替换双反斜杠。 现在我可以成功插入值。

QSqlField f(name, QVariant::String);
f.setValue(fields.value(name));
const QString value = db.driver()->formatValue(f).replace("\\\\", "\\");

问题可能源于Qt(至少在5.x之前)不了解数据库中的json。所以它只能将它视为一个字符串并且看到需要转义反斜杠。

这显然不是一个理想的解决方案。

更新2:
我找到了一个可以接受的解Qt(至少4.7)假定反斜杠是字符串值中的特殊字符。自9.1以来不再是这种情况(默认情况下)。见http://www.postgresql.org/docs/9.4/static/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE
所以我必须设置以下内容,以便Postgresql再次假设\是一个转义反斜杠:

QSqlQuery query(db);
query.exec("SET standard_conforming_strings TO false");

2 个答案:

答案 0 :(得分:1)

看来Qt会自动转义字符串中的任何反斜杠\。为什么 - 我不知道。

你可以尝试使用单引号而不是“。可能是Qt只关心转义双引号。所以写一下:

"callTo('par1', 'par2')")

您可以绕过此问题。 (更新:确认这适用于OP,但显然不是理想的解决方案,因为它只是绕过了问题)

另外,Qt可能有一个选项可用于禁用此功能,但我担心我不熟悉它作为一种工具,可以告诉你它是否存在。

希望这有帮助 - 这不是我想给你的答案,但是如果没有更多知识渊博的Qt专家,它可能会给你一些关于尝试的想法!

答案 1 :(得分:0)

我找到了一个可接受的解决方案。 Qt(至少4.7)假定反斜杠是字符串值中的特殊字符。自9.1以来不再是这种情况(默认情况下)。见http://www.postgresql.org/docs/9.4/static/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE 所以我必须设置以下内容,以便Postgresql再次假设\是一个转义反斜杠:

QSqlQuery query(db);
query.exec("SET standard_conforming_strings TO false");