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

时间:2018-02-22 19:16:57

标签: neo4j cypher cypher-3.1

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

2 个答案:

答案 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