我在向neo4j api发送内容时遇到了麻烦。 这是我要求的主体。
{
"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]"
}
]
}
我的代码实际上有什么问题?当我在那里只有一个属性时,为什么会有逗号呢?
我试过这个:(更好的格式化)
"statement" : "CREATE ( user:User { name: "jon" } ) Return user"
同样的错误。模仿此后:
"statement" : "CREATE ( bike:Bike { weight: 10 } ) Return bike"
哪种方法效果很好。它来自文档。
唯一的区别是字符串。但是我应该如何编码jon
?
因为这个:
"statement" : "CREATE ( user:User { name: jon } ) Return user"
也不起作用。
我发现这非常直观。 任何帮助表示赞赏:)也许你可以提供一些解释为什么这是必要的。谢谢:))
修改
根据@cybersam的回答 - 我意识到我忘了逃避字符串。
然而这:
"statement" : "CREATE (user:User{\"name\":\"jon\"}) Return user"
产生这个:
"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 ^"
}
我的代码使用elixir maps
模块从json
自动生成Poison
。我似乎没有按照建议让Posion给我{ name : 'jon' }
。
答案 0 :(得分:1)
JSON字符串不能包含未转义的双引号(“)。
由于Cypher接受单引号和双引号来分隔字符串,因此最简单和最易读的解决方法是使用单引号来嵌入字符串文字,如下所示:
"Create (user:User{ name: 'jon' }) Return user"
[编辑]
顺便说一句:不要试图逃避嵌入的双引号,因为这通常需要凌乱且难以理解的代码。尝试使用语言或软件生成包含转义字符的字符串,这些字符或软件也使用相同的方法来转义字符,这根本不好玩。只使用单引号更容易(并且适用于所有语言)。
答案 1 :(得分:0)
这里出现的问题是存在两个问题:
首先,当手动测试时 - 我忘了逃避双引号。
其次,在实际程序中 - 我正在编码已经编码的elixir结构。双重编码。
我正在将此elixir地图%{ name: "jon" }
编码为{\"name\": \"jon\"}
json。
然后将其放在一个密码查询中 - 这是一个字符串:"Create (user:User{\"name\": \"jon\"}"
然后将此字符串放入预期的包装器中:%{ statement : "Create (user:User{\"name\": \"jon\"}" }
这是一个灵丹妙药地图。
然后再将此地图编码为json。道具现在在json里面逃过json。我疯了!
<强>解决方案:强>
将道具插入parameters
字段。拍摄from the neo4j http endpoing docs。
{
"statements" : [
"statement" : "CREATE (user: User{props}) RETURN user",
"parameters" : {
"props" : {
"name" : "jon"
}
}
]
}
从以下方式获得:
%{
statements: [
%{
statement: "Create (user:User{props}) Return user",
parameters: %{props: %{name: "jon"}}
}
]
}
|> Poison.encode