2016-04-26 27 views
5

Używam PostgreSQL do mojego webaplikacji. Jestem nowy w tym Postgresql-json. Po prostu chcę uzyskać wynik zapytania kwerendy w postaci struktury json. Oto moje dane:Transform SQL ResultSet do json

create table sample(id serial, info jsonb); 
insert into sample("info") values('{"person": {"phone": 9804484234,"name":{"firstname":"Alice", "lastname":"bob"}, "empId": "E067", "age":25}'); 

kwerenda wybierająca:

select "info"->'person'->>'lastname' from sample; 

wynik: bob

ale chcę uzyskać powyższy wynik wraz z węzłami json jak poniżej:

result: {"person": 
      {"name": 
      {"lastname":"bob"} 
      } 
     } 

Czy jakiekolwiek ciało może mi powiedzieć, jak uzyskać oczekiwaną strukturę wyników z bazy danych.

+0

Witam wszystkich, proszę dać mi znać, jeśli moje zapytanie nie jest jasne. W razie potrzeby przedstawię więcej szczegółów. –

+0

Czy możesz sprawić, że jakieś ciało mi powie, czy to możliwe, czy nie? –

+0

Pytanie nie ma sensu z punktu widzenia, dlaczego chciałbyś to zrobić. Jeśli próbujesz zdobyć cały dokument JSON dla kogoś o nazwisku bob, który miałby sens, lub co twój kod aktualnie robi, to piszę o jsonie dla tego nazwiska, ma sens, ale dlaczego chcesz tylko json, tak jak ty pytają, nie ma sensu i nie da się tego łatwo zrobić w postgresie. json_extract_path zbliża się do tego, o co prosisz. –

Odpowiedz

1

będzie znacznie prostsze mieć:

A- normalnej bazy danych PostgreSQL i przekształcić odpowiedź JSON.

  • A1. przechowuj normalny SQL DB (i bez postgres sql json)
  • A2. pobierz wynik SQLSet (wybierz zapytanie)
  • A3. konwertować resultset do json z tym kodem

    public class SOF_36861985 { 
    
          public static JSONArray toJson(ResultSet res) throws Exception { 
           JSONArray array = new JSONArray(); 
           while (res.next()) { 
            int size = res.getMetaData().getColumnCount(); 
            JSONObject obj = new JSONObject(); 
            for (int i = 0; i < size; i++) { 
             obj.put(res 
               .getMetaData() 
               .getColumnLabel(i + 1) 
               .toLowerCase(), 
               res.getObject(i + 1)); 
             array.put(obj); 
            } 
           } 
           return array; 
          } 
    
        } 
    

lub

B. Wykorzystanie MongoDB, że to jest JSON rodzimych baza danych,

  • B1. Przechowuj dane w mongoDB jako json
  • B2. Zapytanie MongoDB powróci json resultset

komparacji roztworu A kontra roztwór B

Roztwór A: sql + nie zmusza cię mieć nowy DB, będzie nadal z PostgreSQL - uczyni konwersja do formatu JSON od ResultSet - będzie mieć statyczny schemat w bazie danych SQL (nie dynamiczny schematu jak w NoSQL)

Roztwór B: Mongo - umożliwia zmianę DB, który jest zależny od produkcji ... i ma wpływ na INFRAS TRUKTURA .... + json jest rodzimy DB + to prawdopodobnie nowy DB dla Ciebie, będziesz mieć czas nauki do opanowania go (zajmie więcej czasu, aby skonfigurować, zainstalować, Dev ...)

1

Możesz odtworzyć ścieżkę, którą podążasz, jako stałą łańcuchową, o ile ścieżka jest stała.

select '{"person":{"name":{"lastname":"' || 
(info->'person'->'name'->>'lastname') || 
'"}}}'as val from sample; 
+0

Korzystam z powyższej składni, ale nie dostałem żadnego właściwego wyjścia. W konsoli pokazuje 1 wiersz, ale brak danych wyjściowych. –

+0

Tak, mam dane wyjściowe, ale czy to jedyny sposób, aby uzyskać wyjście JSON? ponieważ mam dużo zagnieżdżonych danych json. Nie mogę iść do każdego węzła. –

+0

Niestety, JSON nie ma DOM, XPath lub coś podobnego. W przeciwieństwie do XML, który jest formatem dokumentu, JSON ma być raczej lekkim formatem wiadomości niż opcją przechowywania. Sam Postrgesql nie ma metod działania na ścieżkach JSON, a raczej ścieżce get-to-root. – Serg

0
SELECT json_build_object("person", 
    json_build_object("name", 
    json_build_object("lastname", 
    (info->'person'->'name'->>'lastname')))) 
AS val FROM sample;