2016-08-08 28 views
0

Es sieht so aus, als ob meine PSQL-Datenbank einige falsch formatierte JSON-Felder enthält. Daher kann ich diese Daten nicht mit den Operatoren - >> abrufen.psql - Abrufen von JSON-Daten, die Sonderzeichen enthalten

Ich habe eine Tabelle mit der Spalte "Reputation" des Typs Json.

Ich führe Abfrage „Ruf“ Spalte für ein bestimmtes Objekt zu erhalten:

select reputation from hashes where sha1='c1b5684e132a85d18a35ddb98233cc2b71efcf0e' 

ich folgendes Ergebnis erhalten, die wie json mit Escape-Zeichen formatiert aussieht:

"{\"status\": \"MALICIOUS\", \"scanner_match\": 33, \"first_seen\": \"2010-05-27T09:00:27\", \"scanner_count\": 34, \"last_seen\": \"2010-05-27T09:00:27\"}" 

Allerdings, wenn ich versuche ein bestimmtes feld in diesem json zu bekommen, bekomme ich nichts:

select reputation->>status from hashes where sha1='c1b5684e132a85d18a35ddb98233cc2b71efcf0e' 

ich a lso versucht, die folgende Abfrage zu überprüfen, wie psql diese json behandelt und erhielt Fehler:

select * from json_each((select reputation from hashes where sha1='c1b5684e132a85d18a35ddb98233cc2b71efcf0e')); 
ERROR: cannot deconstruct a scalar 

So sieht es aus wie psql nicht dies als json erkennen. Wenn ja, habe ich ein paar Fragen:

  1. Wenn dies ist ungültig JSON-Format, wie ist es dann möglich, dass PSQL ermöglicht es uns, schlecht formatierte JSON zu JSON-Typ Spalte einfügen?
  2. Ist es irgendwie möglich, auf diese JSON-Felder im bestehenden Zustand zuzugreifen (vielleicht mit einigen Sonderzeichen in den Namen)?

Antwort

0

ist die Backslashes. Psql sieht sie als Escape-Zeichen und fügt sie ohne Probleme in einen json-Datentyp ein.

Ansicht in Sql die Zeichenfolge wird als Zeichenfolge und nicht als Json angezeigt, Sie müssen einige Zeichenfolgenfunktionen ausführen, um die fehlerhaften Zeichen zu entfernen.

with cte as(
select cast ('"{\"status\": \"MALICIOUS\", \"scanner_match\": 33, \"first_seen\": \"2010-05-27T09:00:27\", \"scanner_count\": 34, \"last_seen\": \"2010-05-27T09:00:27\"}"'as json) as string) 

select cast(ltrim(rtrim(replace(cast(string as text),'\',''),'"'),'"')as json) 
from cte 

Dies gibt einen json Datentyp