2014-06-12 12 views
10

Prawidłowy JSON może oczywiście mieć znak ukośnika odwrotnego: \. Po wstawieniu danych do instrukcji SQL w następujący sposób:Wstawianie poprawnego jsona z kopią do tabeli postgresowej

sidharth=# create temp table foo(data json); 
CREATE TABLE 
sidharth=# insert into foo values('{"foo":"bar", "bam": "{\"mary\": \"had a lamb\"}" }'); 
INSERT 0 1 

sidharth=# select * from foo; 

data       
\----------------------------------------------------- 

{"foo":"bar", "bam": "{\"mary\": \"had a lamb\"}" } 
(1 row) 

Wszystko działa dobrze.

Ale gdybym skopiuj JSON do pliku i uruchom polecenie kopiowania uzyskać:

sidharth=# \copy foo from './tests/foo' (format text); 


ERROR: invalid input syntax for type json 
DETAIL: Token "mary" is invalid. 
CONTEXT: JSON data, line 1: {"foo":"bar", "bam": "{"mary... 
COPY foo, line 1, column data: "{"foo":"bar", "bam": "{"mary": "had a lamb"}" }" 

Wygląda PostgreSQL nie jest przetwarzanie backslashy. Myślę, że z powodu http://www.postgresql.org/docs/8.3/interactive/sql-syntax-lexical.html i jestem zmuszony użyć podwójnego ukośnika odwrotnego. A to działa, tj. Gdy zawartość pliku:

{"foo":"bar", "bam": "{\\"mary\\": \\"had a lamb\\"}" } 

Polecenie kopiowania działa. Ale czy słuszne jest spodziewać się specjalnej obróbki dla typów danych JSON? , ponieważ po powyższym nie jest prawidłowym jsonem.

Odpowiedz

6

Domyślny format obciążenia zbiorczego PostgreSQL, text, jest znacznikiem oddzielonym tabulatorami. Wymaga ukośników odwrotnych, ponieważ mają one specjalne znaczenie dla (np.) Elementu zastępczego o wartości Null wynoszącej \N.

przestrzegać co generuje PostgreSQL:

regress=> COPY foo TO stdout; 
{"foo":"bar", "bam": "{\\"mary\\": \\"had a lamb\\"}" } 

Nie jest to przypadek szczególny dla json w ogóle, to prawda dowolnego ciągu znaków. Rozważmy na przykład, że ciąg znaków - w tym json - może zawierać osadzone karty. Trzeba im uciec, aby nie byli postrzegani jako inne pole.

Będziesz musiał wygenerować poprawnie dane wejściowe. Zamiast próbować korzystać z formatu PostgreSQL text, łatwiej będzie używać format csv i używać narzędzia, które będzie zapisywać poprawny plik CSV, przy czym wykonanie zostanie wykonane za Ciebie podczas pisania.

+0

Nie rozumiem odpowiedź. W szczególności dlaczego ucieczka nie jest wykonywana przez PostgreSQL? Wygląda na to, że PostgreSQL akceptuje plik oddzielony tabulatorami (który może zawierać JSON wewnątrz), a nie tylko plik JSON. –

+0

@ChrisStryczynski To prawda. To jest TSV. 'COPY' nie jest używane do ładowania pojedynczych pól, służy do ładowania tabel *. –

6

http://adpgtech.blogspot.ru/2014/09/importing-json-data.html

copy the_table(jsonfield) 
from '/path/to/jsondata' 
csv quote e'\x01' delimiter e'\x02'; 
+0

Podaj więcej kontekstu dla linku opublikowanego w odpowiedzi oraz fragmentu kodu. [How to Answer] (http://stackoverflow.com/help/how-to-answer) – AgataB

+0

To jest, w chwili pisania tego tekstu, poprawna odpowiedź na pytanie OP: jak odczytać json z systemu plików * bez * konieczności stosowania specjalnej składni ewakuacyjnej (co powoduje, że json jest nieprawidłowy). Niestety, większość użytkowników przerzuci odpowiedź ze względu na spadki i niski Reprezentant SO. Odpowiedź mogłaby być lepsza, ale był to po prostu napęd od użytkownika innego niż SO ... – virtualeyes

Powiązane problemy