2012-07-03 205 views
2
在PostgreSQL和JSON解析文本类型列双引号的转义


我有以下表中PostgreSQL的定义:
通过杰克逊

 Column  |   Type   | Modifiers 
-----------------+------------------------+----------- 
id    | uuid     | not null 
entity_snapshot | text     | 
Indexes: 
    "pk_id" PRIMARY KEY, btree (id) 

我想存储以下JSON字符串:

[ "org.test.MyUniqueId", {: "uuid" : "f4b40050-9716-4346-bf84-8325fadd9876": } ] 

对于一些测试,而不是这样做使用杰克逊,我尝试手动键入一个SQL,这里是我的问题 - 我似乎无法得到正确的。
我现在的尝试是:

insert into my_table(id,entity_snapshot) values ('d11d944e-6e78-11e1-aae1-52540015fc3f','[ \"org.test.MyUniqueId\", {: \"uuid\" : \"f4b40050-9716-4346-bf84-8325fadd9876\": } ]'); 

Procuedure看起来像什么,我需要当我从表中选择,但是当我尝试使用杰克逊解析它,我得到一个错误的纪录 -

org.apache.commons.lang.SerializationException: org.codehaus.jackson.JsonParseException: Unexpected character (':' (code 58)): was expecting double-quote to start field name 

不用说,如果通过我的java代码插入相同的记录,我可以解析它,当涉及到用人眼来查看记录时,它对我来说看起来是一样的。
你能告诉我在我的SQL插入语句中我错了吗?

+0

您可以使用sqldump写在Java插入行和手动文本文件和比较什么是与手动插入不同。 –

回答

3

双引号内的单引号不需要进行转义处理。

insert into my_table (id,entity_snapshot) 
values 
(
    'd11d944e-6e78-11e1-aae1-52540015fc3f', 
    '["org.test.MyUniqueId", {: "uuid" : "f4b40050-9716-4346-bf84-8325fadd9876": }]' 
); 

会工作得很好:

 
postgres=> create table my_table (id uuid, entity_snapshot text); 
CREATE TABLE 
Time: 34,936 ms 
postgres=> insert into my_table (id,entity_snapshot) 
postgres-> values 
postgres-> (
postgres(> 'd11d944e-6e78-11e1-aae1-52540015fc3f', 
postgres(> '["org.test.MyUniqueId", {: "uuid" : "f4b40050-9716-4346-bf84-8325fadd9876": }]' 
postgres(>); 
INSERT 0 1 
Time: 18,255 ms 
postgres=> 
6

您可以使用美元引用字符串常量。 详情请看这里Postgres documentation

在你的情况的查询应该像

insert into my_table(id,entity_snapshot) values ('d11d944e-6e78-11e1-aae1-52540015fc3f',$$[ "org.test.MyUniqueId", {: "uuid" : "f4b40050-9716-4346-bf84-8325fadd9876": } ]$$);