【发布时间】:2022-11-12 10:57:26
【问题描述】:
我正在测试 RedisGraph 作为将来自客户端的数据存储为 JSON 的一种方式。
JSON 通过 bean 进行验证等,我使用 Jackson 序列化 bean,因此 RedisGraph 字符串的格式正确。有关该格式化步骤的完整性,请参阅最后的示例代码。
数据属性可能包含有效 JSON 格式的单引号,例如:O'Toole
{ "name" : "Peter O'Toole", "desc" : "An actors actor" }
我可以根据最后的代码块使用格式化程序将 JSON 转换为 RedisGraph 命令将允许处理单引号的格式(我不需要转义数据内容 - 即它可以使用客户端发送的内容) .例如这有效:
GRAPH.QUERY movies "CREATE (:Actor {name:\"Peter O'Toole\", desc:\"An actors actor\", actor_id:1})"
到目前为止,一切都很好。
现在,问题是:我在保留原始 JSON 的语法时遇到了问题,它还包含转义的双引号。例如:
{ "name" : "Peter O'Toole", "desc" : "An \"actors\" actor" }
我不想转义或包装 desc 属性值,因为它已经被转义为有效的 JSON。但是,我如何构造 RedisGraph 命令,以便它使用给定的值保留属性?即包含转义的双引号。
换句话说,由于 desc 属性中的 \",这会引发解析错误。
GRAPH.QUERY movies "CREATE (:Actor {name:\"Peter O'Toole\", desc:\"An \"actors\" actor\", actor_id:1})"
鉴于想要保留包含有效 JSON 转义双引号 \" 和未转义单引号的数据是很常见的,因此必须有一种方法可以做到这一点。例如姓名和地址数据。
有任何想法吗?
谢谢,默里。
PS:这也不起作用:它阻塞了 O'Toole 中的嵌入式 '
GRAPH.QUERY movies "CREATE (:Actor {name:\'Peter O'Toole\', desc:\'an \"actors\" actor\', actor_id:3})"
// \u007F is the "delete" character.
// This is the highest char value Jackson allows and is
// unlikely to be in the JSON (hopefully!)
JsonFactory builder = new JsonFactoryBuilder().quoteChar('\u007F').build();
ObjectMapper objectMapper = new ObjectMapper(builder);
// Set pretty printing of json
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
// Do not surround property names with quotes. ie { firstName : "Peter" }
objectMapper.configure(JsonWriteFeature.QUOTE_FIELD_NAMES.mappedFeature(), false);
// Make a Person
Person person = new Person("Peter", "O'Toole");
// Set the desc property using embedded quotes
person.setDesc("An \"actors\" actor");
// Convert Person to JSON
String json = objectMapper.writeValueAsString(person);
// Now convert your json to escape the double quotes around the string properties:
String j2 = json.replaceAll("\u007F", "\\\\\"");
System.out.println(j2);
这产生:
{
firstName : \"Peter\",
lastName : \"O'Toole\",
desc : \"An \"actors\" actor\"
}
这是 Redis GRAPH.QUERY movies "CREATE..." 可以使用的格式(除了上面讨论的 \"actors\" 的问题)。
【问题讨论】:
-
这不是为你工作吗?
GRAPH.QUERY movies 'CREATE (:Actor {name:"Peter O\'Toole", desc:"An \"actors\" actor", actor_id:1})' -
谢谢。正如你所建议的,只要我使用
O\'Toole,语法就可以了。我的帖子的重点是带有双引号的传入数据属性被转义了\"actors\",但带有单引号的传入属性不是,即O'Toole。
标签: java redis redisgraph