2016-04-26 16 views
5

Sto usando postgresql per la mia webapplication. Sono nuovo di questo Postgresql-json. Voglio solo ottenere il risultato della query di selezione sotto forma di struttura json. Qui ci sono i miei dati:Transform SQL ResultSet to 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}'); 

query di selezione:

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

risultato: bob

ma voglio ottenere il risultato di cui sopra insieme con i nodi di JSON come di seguito:

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

qualsiasi organismo potrebbe dirmi come ottenere la struttura dei risultati prevista dal database.

+0

Ciao a tutti, per favore fatemi sapere se la mia domanda non è chiaro. Fornirò maggiori dettagli se necessario. –

+0

Potresti per favore un po 'di corpo dirmi, è possibile o no? –

+0

La domanda non ha senso dal punto di vista del perché vorresti farlo. Se stavate cercando di ottenere l'intero documento JSON per qualcuno con il cognome bob che avrebbe senso, o cosa faccia attualmente il vostro codice che analizza il json per il cognome, ha senso, ma perché volete solo il json come voi stanno chiedendo non ha senso e non c'è modo di farlo facilmente con Postgres. json_extract_path si avvicina a quello che stai chiedendo però. –

risposta

1

sarà molto più semplice di avere:

A- A normale di database PostgreSQL e trasformare la risposta a JSON.

  • A1. memorizzare un normale DB SQL (e non postgres sql json)
  • A2. recuperare un risultato SQL Set (selezionare query)
  • A3. convertire di risultati in JSON con questo codice

    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; 
          } 
    
        } 
    

o

B. Usare MongoDB che è database nativo JSON

  • B1. Memorizza i dati in mongoDB come json
  • B2. interrogazione MongoDB tornerà JSON di risultati

Comparazione di Soluzione A contro Soluzione B

Soluzione A: sql + non ti costringono a avere un nuovo DB, si proseguirà con PostgreSQL - farà una conversione da ResultSet a JSON - avrà lo schema statico nel database SQL (nessuno schema dinamico come in NoSQL)

Soluzione B: mongo - rende il cambiamento di DB, che è la produzione dipende ... e ha un impatto sulla infras TRUTTURA .... + è nativo JSON DB + è probabilmente un nuovo DB per voi, si avrà un tempo di apprendimento per dominarlo (ci vorrà più tempo per l'installazione, l'installazione, dev ...)

1

È possibile riprodurre il percorso che si sta seguendo come costante di stringa, purché il percorso sia corretto.

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

Sto usando la sintassi precedente, ma non ho ricevuto alcun out corretto. Nella console mostra 1 riga ma nessuna uscita. –

+0

Sì, ho ricevuto l'output ma è l'unico modo per ottenere l'output JSON? perché ho molti dati json annidati. Non posso andare a ciascun nodo. –

+0

Sfortunatamente, JSON non ha DOM, non XPath o qualcosa di simile. Contrariamente all'XML che è il formato del documento, JSON è concepito per essere un formato di messaggio leggero piuttosto che un'opzione di archiviazione. Postrgesql non ha metodi per operare su percorsi JSON, tipo get-path-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;