Neo4j &引用;无法反序列化请求:意外字符(';j';(代码106)):应使用逗号分隔对象条目
我无法将某些内容发送到neo4j api。 这是我请求的主体Neo4j &引用;无法反序列化请求:意外字符(';j';(代码106)):应使用逗号分隔对象条目,neo4j,cypher,cypher-3.1,Neo4j,Cypher,Cypher 3.1,我无法将某些内容发送到neo4j api。 这是我请求的主体 { "statements" : [ { "statement" : "Create (user:User{ name: "jon" }) Return user" } ] } 我得到: { "results": [], "errors": [ { "code": "Neo.ClientError.Request.InvalidFormat",
{
"statements" : [ {
"statement" : "Create (user:User{ name: "jon" }) Return user"
} ]
}
我得到:
{
"results": [],
"errors": [
{
"code": "Neo.ClientError.Request.InvalidFormat",
"message": "Unable to deserialize request: Unexpected character ('j' (code 106)): was expecting comma to separate OBJECT entries\n at [Source: HttpInputOverHTTP@7481578b; line: 3, column: 45]"
}
]
}
我的代码到底出了什么问题?当我只有一个属性时,为什么它会要求使用逗号?
我试过:(更好的格式)
“语句”:“创建(用户:用户{name:“jon”})返回用户”
同样的错误。仿照此:
“声明”:“创建(自行车:自行车{重量:10})归还自行车”
这很好用。这是文档中的
唯一的区别是字符串。但是我应该如何对jon
进行编码呢
因为:
“语句”:“创建(用户:用户{name:jon})返回用户”
也不行
我觉得这很违反直觉。
感谢您的帮助:)也许您可以解释一下为什么这是必要的。谢谢:)
编辑
基于@cybersam answer-我意识到我忘了逃逸字符串
然而,这:
“语句”:“创建(用户:用户{\“name\”:\“jon\”})返回用户”
产生以下结果:
"errors": [
{
"code": "Neo.ClientError.Statement.SyntaxError",
"message": "Invalid input '\"': expected whitespace, a property key name, '}', an identifier or UnsignedDecimalInteger (line 1, column 19 (offset: 18))\r\n\"CREATE (user:User{\"name\":\"jon\"}) Return user\"\r\n ^"
}
使用
Poison
模块,我的代码会自动从elixir映射到json
。我觉得按照建议给我{name:'jon'}
似乎不起作用。JSON字符串不能包含未替换的双引号(“)
由于Cypher同时接受单引号和双引号来分隔字符串,因此解决这一问题的最简单和最可读的方法是对嵌入的字符串文本使用单引号,如下所示:
"Create (user:User{ name: 'jon' }) Return user"
[编辑]
顺便说一句:不要费心尝试转义嵌入的双引号,因为这通常需要混乱且难以理解的代码。尝试使用同样使用转义字符方法的语言或软件生成包含转义字符的字符串一点也不有趣。仅使用单引号更容易(应该适用于所有语言)。这里的问题来自以下两个问题:
首先,当手动测试时,我忘记了转义双引号
第二,在实际的程序中-我正在编码一个已经编码的长生不老药结构。双重编码
我把这张长生不老药地图编码为:%{name:“jon”}
到{\“name\”:\“jon\”}
json
然后把它放在一个密码查询中,这是一个字符串:“Create(user:user{\'name\':\'jon\'”}”
然后将此字符串放入预期的包装器:%{statement:“Create(user:user{\'name\':\'jon\'}”}
,这是一个长生不老药映射
然后再把这个地图编码成json。道具现在是json里面的转义json。我疯了
解决方案:
将道具插入参数
字段。
可从以下网址获得:
%{
statements: [
%{
statement: "Create (user:User{props}) Return user",
parameters: %{props: %{name: "jon"}}
}
]
}
|> Poison.encode
这是有道理的。虽然我也尝试了转义双引号-只是忘了提及-例如:“CREATE(user:user{\'name\\:\'jon\'})Return user”
我正在从elxir映射创建这个json。我使用Posion模块。我无法控制生成什么。为什么{\'name\\:\'jon\}
version不起作用?我将用这个更新我的答案。这是因为您试图使用一种语言或软件生成一个包含转义字符的字符串,该语言或软件也使用相同的方法来转义字符,这可能真的让人费解。要解决这个问题,您最终要做的事情总是非常困难的简单且难以维护。采取简单的解决方法(这也适用于所有语言)并使用单引号。是的,没错。希望我可以。Elixir有结构、映射和其他特殊构造,这些结构会被毒药模块自动转换为json。到目前为止,我找不到一种方法来生成如您所示的单引号字符串值。仍在搜索。。
%{
statements: [
%{
statement: "Create (user:User{props}) Return user",
parameters: %{props: %{name: "jon"}}
}
]
}
|> Poison.encode