2016-04-21 9 views
0

PL/SQL-Neuling hier.Parse JSON-Array in PL/SQL

Ich verwende Oracle APEX als meinen REST-Server und sende ein JSON-Array (items) von meiner App an den REST-Server. Der JSON enthält Protokolle, von denen es 100er geben könnte. Ich kann sie eins nach dem anderen erfolgreich senden, aber das ist nicht effizient, deshalb möchte ich stattdessen ein JSON-Array senden können, das die Logs enthält. Hier

ist einige Test JSON:

{ 
    "items": [{ 
     "source": "00000999", 
     "message": "test1" 
    }, { 
     "source": "00000999", 
     "message": "test2" 
    }, { 
     "source": "00000999", 
     "message": "test3" 
    }, { 
     "source": "00000999", 
     "message": "test4" 
    }] 
} 

Sobald ich analysieren kann, dass JSON-Array, dann werde ich sie in die Datenbank als separate Zeilen hinzufügen.

Hier ist, was ich im Moment haben:

set serveroutput on; 
declare 
items varchar2(2000):= '{"items":[{"source": "00000999","message": "test1"}, {"source": "00000999","message": "test2"}, {"source": "00000999","message": "test3"}, {"source": "00000999","message": "test4"}]}'; 
v_source varchar2(100); 
    v_message varchar2(2000); 
    v_json_list json_list; 
    v_json_list2 json_list; 
begin 
    v_json_list := json_list(items); 
    v_json_list2 := json_ext.get_string(json(v_json_list.GET(0)),'items'); 
    for i in 1..v_json_list2.count 
     loop 
     begin 
      v_source := json_ext.get_string(json(v_json_list2.GET(i)),'source'); 
      v_message := json_ext.get_string(json(v_json_list2.GET(i)),'message'); 
      ca_log_pak.log_info(v_source, v_message); 
     end; 
     end loop; 
    commit; 

    dbms_output.put_line('Y'); 


exception 
    when others then 

     dbms_output.put_line(SQLERRM); 
end; 

Dies ist ein Fehler werfen sagen expression is of the wrong type auf v_json_list := json_list(items);

Kann mir jemand zeigen, wie richtig die items Array zu analysieren?

Dank

+0

Fehler sehen, ist weitgehend selbsterklärend. "Falscher Typ" –

+0

Könnten Sie einen Typ vorschlagen, den ich anstelle von json_list verwenden kann? – eoinzy

Antwort

1

Ich denke, Ihre JSON-String so sein sollte:

[{"source": "00000999","message": "test1"}, {"source": "00000999","message": "test2"}, {"source": "00000999","message": "test3"}, {"source": "00000999","message": "test4"}] 

Versuchen Sie folgendes:

DECLARE 
    items VARCHAR2(2000):= '{"items":[{"source": "00000999","message": "test1"}, {"source": "00000999","message": "test2"}, {"source": "00000999","message": "test3"}, {"source": "00000999","message": "test4"}]}'; 
    my_json json_list := json_list(LTRIM(RTRIM(items,'}'), '{"items":')); 
    listElement json_value; 
    jsonObj json; 
BEGIN 
    FOR i IN 1..my_json.count 
    LOOP 
    listElement := my_json.get(i); 
    jsonObj  := json(listElement); 
    dbms_output.put_line(jsonObj.json_data(1).mapname); 
    dbms_output.put_line(jsonObj.json_data(1).str); 
    END LOOP; 
END; 
+0

Ist es möglich, den vorhandenen JSON zu verwenden, den ich habe? Es wird automatisch von der Client-Seite generiert und ich denke, der Aufwand, es auf dem Client zu ändern, ist mehr als wenn es eine einfache Lösung auf der Serverseite gibt. Vielen Dank. – eoinzy

+1

Was Wenn Sie den zusätzlichen Text am Anfang und am Ende der Zeichenfolge entfernen? Etwas wie 'LTRIM (RTRIM (, '}'), '{" items ":')' Ich habe meine Antwort bearbeitet. –

+0

OK danke, das war eine echte Hilfe! – eoinzy

0

haben Sie in 5,0 es Sie versuchen, verwenden apex_json Paket mithilfe kann Ihre Daten in eine Adhoc-XML-Tabelle konvertieren und mit dem INSERT INTO SELECT-Konzept in Ihre permanente Tabelle einfügen. können Sie die Probe von apexjson und XML-Tabelle bei

Parse JSON object to use in Apex item select list