2017-07-13 3 views
3

Versionen: Neo4j 3.2.2 Community; APOC 3.2.0.3apoc.convert.fromJsonMap() verarbeitet in Zeichenfolgen keine fehlerhaften Zeichen

Escaped Zeichen in Zeichenfolgen werden nicht in allen Instanzen korrekt behandelt.

Dies funktioniert wie erwartet:

WITH apoc.convert.fromJsonMap('{"a":42,"b":"foo\\bar","c":[1,2,3]}') AS p RETURN p.b 

╒═════════╕
│ "pb" │
╞═════════╡
│ "foo \ bar" │
└─────────┘

zitiert Escaping funktioniert nicht wie erwartet:

WITH apoc.convert.fromJsonMap('{"a":42,"b":"\"foo\"","c":[1,2,3]}') 
AS p RETURN p.b 

Neo.ClientError.Procedure.ProcedureCallFailed Funktion aufzurufen fehlgeschlagen apoc.convert.fromJsonMap: Verursacht durch: java.lang.RuntimeException: Kann nicht konvertieren { "a": 42, "b": "" foo "", "c „: [1,2,3]} mit Pfad

Verdoppeln auf der Rückseite Solidus zur Karte (nicht wünschenswert) gibt dieses Ergebnis:

WITH apoc.convert.fromJsonMap('{"a":42,"b":"\\"foo\\"","c":[1,2,3]}') AS p RETURN p.b 

╒═════════╕
p "pb" │
╞═════════╡
│ "\" foo \ "" │
└─────────┘

Ein entkommen Zeilenendezeichen den gleichen Fehler erhält:

WITH apoc.convert.fromJsonMap('{"a":42,"b":"foo\nbar","c":[1,2,3]}') AS p RETURN p.b 

Neo.ClientError.Procedure.ProcedureCallFailed Fehler beim Aufrufen der Funktion apoc.convert.fromJsonMap: Verursacht von: java.lang.RuntimeException: Kann {"a": 42, "b": "foo bar", "c": [1,2,3]} nicht konvertieren Karte mit Pfad

[Beachten Sie, dass der Zeilenumbruch nach "foo" in der Zeichenfolge dargestellt wird, die von der Fehlerverletzung zurückgegeben wird Alter. Die Fehlermeldung wird in zwei Zeilen ausgegeben.]

Ist meine Verwendung dieses Verfahrens korrekt?

Hat jemand dieses Problem gesehen und behoben oder um es herum gearbeitet?

Antwort

0

Die Verwendung eines doppelten Backslash anstelle eines einzelnen Backslashs zum Maskieren von Zeichen funktioniert tatsächlich.

Zum Beispiel können diese zwei Abfragen beide true zurück:

RETURN apoc.convert.fromJsonMap('{"a":42,"b":"\\"foo\\"","c":[1,2,3]}').b = '"foo"'; 

RETURN apoc.convert.fromJsonMap('{"a":42,"b":"foo\\nbar","c":[1,2,3]}').b = 'foo\nbar'; 
+1

Dies ist eine gute Beobachtung. Die JSON-Eingabezeichenfolge ist jedoch keine wirklich gültige JSON-Zeichenfolge. Ich werde dies jedoch für eine mögliche Problemumgehung berücksichtigen. – jimwilli

Verwandte Themen