2016-04-26 17 views
5

Ich benutze Postgresql für meine Webapplikation. Ich bin neu in diesem Postgresql-json. Ich möchte nur das Select-Abfrage-Ergebnis in Form von JSON-Struktur erhalten. Hier sind meine Details:Transform SQL ResultSet zu 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}'); 

Auswahlabfrage:

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

Ergebnis: bob

aber ich mag, wie unten zusammen mit dem json Knoten das obige Ergebnis erhalten:

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

könnte mir jeder Körper sagen, wie ich meine erwartete Ergebnisstruktur aus der Datenbank bekomme.

+0

Hallo alle, Bitte lassen Sie mich wissen, wenn meine Frage nicht klar ist. Ich werde mehr Details zur Verfügung stellen, wenn erforderlich. –

+0

Könntest du mir bitte sagen, Ist das möglich oder nicht? –

+0

Die Frage macht keinen Sinn aus dem Grund, warum Sie das tun möchten. Wenn Sie versuchen, das gesamte JSON-Dokument für jemanden mit dem Nachnamen bob, der Sinn machen würde, oder was Ihr Code derzeit tut, die den JSON für den Nachnamen analysiert, macht Sinn, aber warum möchten Sie nur das JSON wie Sie Fragen stellen keinen Sinn dar und es gibt keine Möglichkeit, das in Postgres leicht zu machen. json_extract_path kommt dem nahe, wonach Sie fragen. –

Antwort

1

wird viel einfacher sein, zu haben:

A- eine normale PostgresSQL Datenbank und die Reaktion auf json verwandeln.

  • A1. Speichern Sie eine normale SQL DB (und keine Postgres SQL JSON)
  • A2. Abrufen eines SQL-Ergebnissatzes (Abfrage auswählen)
  • A3. konvertieren resultset in json mit diesem Code

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

oder

B. Verwendung mongoDB die json native Datenbank ist

  • B1. Speichern Sie Daten in MongoDB als JSON
  • B2. Abfrage mongoDB wird json resultset

Vergleich der Lösung A im Vergleich zu Lösung B

Lösung A zurück: SQL + dich nicht zwingen, eine neue DB haben, können Sie mit PostgresSQL fortsetzen wird - machen macht Änderung der DB, dh Produktion abhängig ... und hat Auswirkungen auf infras - mongo : - ein convertion von ResultSet zu Json statisches Schema in SQL-Datenbank (kein dynamisches Schema wie in nosql)

Lösung B hat tructure .... + ist json nativen DB + wahrscheinlich eine neue DB für Dich ist, erhalten Sie eine Lernzeit, es zu meistern haben (wird mehr Zeit zum Einrichten nehmen, installieren dev ...)

1

Sie können den verfolgten Pfad als String-Konstante reproduzieren, sofern der Pfad festgelegt ist.

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

Ich benutze die obige Syntax, aber ich habe keinen richtigen Ausgang bekommen. In der Konsole wird 1 Zeile angezeigt, aber keine Ausgabe. –

+0

Ja, ich habe die Ausgabe, aber ist dies die einzige Möglichkeit, json Ausgabe zu bekommen? weil ich viele verschachtelte JSON-Daten habe. Ich kann nicht zu jedem Knoten gehen. –

+0

Leider hat JSON kein DOM, keinen XPath oder ähnliches. Im Gegensatz zu XML, das ein Dokumentformat ist, ist JSON eher ein leichtgewichtiges Nachrichtenformat als eine Speicheroption. Postrgesql selbst hat keine Methoden, um auf JSON-Pfaden zu arbeiten, irgendwie 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;