“无法反序列化请求:意外字符('j'(代码 106)):期望用逗号分隔 OBJECT 条目

"Unable to deserialize request: Unexpected character ('j' (code 106)): was expecting comma to separate OBJECT entries

我在向 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]"
        }
    ]
}

我的代码究竟有什么问题?当我那里只有 1 属性 时,为什么它会期待一个逗号?

我试过这个:(更好的格式)

"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                   ^"
        }

我的代码使用 Poison 模块从 elixir maps 自动生成到 json。我按照建议让 Posion 给我 { name : 'jon' } 似乎不起作用。

A JSON 字符串不能包含未转义的 double-quotes (").

由于 Cypher 接受 single-quotes 和 double-quotes 来分隔字符串,解决这个问题的最简单和最易读的方法是对嵌入的字符串文字使用 single-quotes,如下所示:

"Create (user:User{ name: 'jon' }) Return user"

[编辑]

顺便说一下:不要费心尝试转义嵌入式 double-quotes,因为这通常需要混乱且难以理解的代码。尝试使用也使用相同方法转义字符的语言或软件来生成包含转义字符的字符串一点也不好玩。只需使用 single-quotes 就容易得多(并且应该适用于所有语言)。

这里的问题来自于存在 2 个问题的事实:

首先,手动测试时 - 我忘了转义双引号。

其次,在实际程序中 - 我正在编码一个已经编码的长生不老药结构。双重编码。

我正在将这张长生不老药地图编码:%{ 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