[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    May 2004
    Beiträge
    12

    JSON Daten/Tabelle -> Escape Funktion? Nachträglich Backslash einbringen?

    Hallo zusammen,

    bisher habe ich rein auf der iSeries programmiert (Cobol/RPG) nun müssen aber bei einem Kunden immer mehr Daten mit einem Internetshop ausgetauscht werden, daher ist nun SQL, JSON und REST (usw.) nötig. Bisher hatte ich dazu nur eine Grundschulung.

    Bei einem aktuellen Problem nimmt der Shop leider den JSON String nicht an - es müssen zusätzliche Backslash Zeichen vorhanden sein. Zusätzlich muss Alles unter "data" auch noch in einem String stehen, also mit " am Anfang und Ende. Hier ein Beispiel:

    {
    "type":"uebertragung",
    "data":
    "[
    {
    \"FELD1 \ ": \ " 100 \ ",
    \ " FELD2 \ ": \ "A \ ",
    \ " FELD3\":\"T ext\",
    \"FELD4\":\"H100\"
    },
    {
    },
    \"FELD1\":\"200\",
    \"FELD2\":\"B\",
    \"FELD3\":\"Text\",
    \"FELD4\":\"H200\"
    ]"
    }

    Der Shop braucht die Daten natürlich in einem String - ich habe die Struktur hier nur zwecks Übersichtlichkeit in Zeilen aufgetrennt.


    Den Json Datenstring habe ich mit folgenden Befehlen erstellen lassen:

    exec sql create or replace view restlib.V_VRSTYP (JSONDOC) as (
    select json_object( 'type' value 'uebertragung', key 'data' value
    json_arrayagg(
    json_object( key 'FELD1' value (PFFELD1),
    key 'FELD2' value trim(PFFELD2),
    key 'FELD3' value trim(PFFELD3),
    key 'FELD4' value trim(PFFELD4)
    )
    returning clob(2G) ccsid 1208 format json
    )
    )
    from LIB.Datei where PFFELDX = 'xx' and PFFELDY = 'A'
    );

    exec sql create or replace variable restlib.Request_Doc clob(2G) ccsid 1208 default null;

    exec sql values(select * from restlib.V_VRSTYP) into restlib.Request_Doc;

    exec sql create or replace variable restlib.PaketS clob(2G) default null;

    exec sql set restlib.PaketS = restlib.Request_Doc;


    Der Shop möchte die Daten dann als "application/json;charset=utf-8".

    Bei der Übertragung wird aktuellSYSTOOLS.HTTPPOSTCLOB mit dem restlib.PaketS verwendet.

    Fragen:

    Gibt es eine Möglichkeit die Json Daten nachträglich mit den Backlash auszustatten?

    Ich hatte auch schon versucht die Json Struktur im RPGSQL Programm "manuell" zu erstellen, also ohne JSON-Funktion sondern mit ILE Befehlen in eine Varchar Variable. Hier ist dann aber das Varchar Feld das Problem - die 32xxx Zeichen reichen nicht in allen Fällen aus für die Daten.

    Wenn das hier zu schwierig ist - unserer Firma ist auch für eine bezahlte Beratung offen! Das Thema ist leider zeitlich dringend - wir müssen da einfach eine Lösung haben. Es darf mit uns gerne Kontakt aufgenommen werden.

    Vielen Dank und schöne Grüße

    Simon

  2. #2
    Registriert seit
    Nov 2020
    Beiträge
    315
    Hi Simon,

    Du musst das JSON in ein CHAR oder VARCHAR umwandeln und dann dies als Wert für ein neues JSON Attribut verwenden.
    Dann ergänzt SQL den Backslash automatisch hinzu:
    Code:
    VALUES (json_object('data' : CAST(json_array(json_object('feld1': 4711) , json_object('feld2': 4712)) ASvarchar(200))))
    Code:
    {"data":"[{\"feld1\":4711},{\"feld2\":4712}]"}
    lg Andreas

  3. #3
    Registriert seit
    Nov 2020
    Beiträge
    315
    Kleine Ergänzung:
    Wenn euer String etwas größer sein kann, sollltest du lieber CLOB statt CHAR/VARCHAR verwenden.
    Da hast du dann mit der Länge keine Probleme:

    Code:
    VALUES (json_object('data' : CAST(json_array(json_object('feld1': 4711) , json_object('feld2': 4712)) ASclob(200k))))

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    einfacher ist es dies in 2 Schritten zu tun:
    1. Aufbauen des reinen JSON-Objekts ohne Escape.
    2. Beim Anhängen an den Webrequest dann den Escape per Replace('"', '\"') erzeugen.
    Dies wird etwas leichter.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #5
    Registriert seit
    Nov 2020
    Beiträge
    315
    In wie fern ist das einfacher als ein simpler CAST für die JSON Daten?
    Ich würde generell die Funktionen selbst das Escapen von allen Zeichen vornehmen lassen.
    Man vergisst etwas und plötzlich hüpft man von einem Problem ins andere.
    Mit dem simplen CAST kann man beruhigt sein, dass man vielleicht etwas vergessen haben könnte.

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Du hast ja nicht geschrieben, dass der CAST den Replace, also den Escape, automatisch macht.
    Ich glaube auch nicht, dass ein CAST(igendwas as CLOB(nn)) irgendwas mehr macht, denn von JSON weiß der ja nichts.
    Das Hauptproblem bei JSON ist ja, dass man Hochkomma und Anführungsstriche alternativ nehmen kann.
    Und wenn ein JSON in ein JSON eingebettet wird, fangen die Probleme an.
    Das ist wie das O'Hara-Problem beim SQL.

    Das kann sich sogar noch weiter ziehen, da in einem JSON Text ebenso bereits ein Escape enthalten sein kann, also
    "Text" : "irgend ein "Text" steht hier"

    Bettest du sowas ein, ist auch der "\" zu quoten. Was zu

    "Text" : "irgend ein \"Text\" steht hier"

    führt. S.O. Die Data-Eigenschaft soll ein JSON-Objekt als Text enthalten.
    Aht man sich entschieden, Hochkomma zu verwenden gilt dies ebenso. Am schlimmsten wirds, wenn fleißig gemischt wird.
    Gehört das Hochkomma dann zum Text oder zur JSON-Syntax für Konstanten.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  7. #7
    Registriert seit
    Nov 2020
    Beiträge
    315
    Doch hab ich eigentlich genau das geschrieben, denn ich hab geschrieben, dass dadurch SQL den Backslash automatisch hinzufügt.
    Es ist nicht der CAST der das macht, sondern die JSON-Funktion die dann den String (in dem die JSON-Daten enthalten sind) so aufbereiten, dass es ein gültiges JSON entsteht.

    Das was du beschrieben hast, war genau das was ich meinte mit "etwas vergessen" und "hüpft man von ein Problem zum nächsten".
    Das alles erspart man sich, wenn man einfach die Standard-Funktionen verwendet, die einem das alles abnehmen.
    Gleiches gilt auch bei HTML, XML usw.

  8. #8
    Registriert seit
    May 2004
    Beiträge
    12
    Vielen lieben Dank für Eure Antworten und Hilfe! Ich bin aktuell noch dabei die Möglichkeiten auszuprobieren und werde mich nochmals melden.

  9. #9
    Registriert seit
    May 2004
    Beiträge
    12
    Hallo,

    da die Gegenseite eine "krumme" Json Struktur möchte bei der eben nicht überall die Backslash vorhanden sein dürfen habe ich mal die Möglichkeit verwendet die Fuerchau angesprochen hat - also die Json Struktur nachträglich mit Replace anzupassen.

    Also zuerst vor allen Gänsefüsschen einen Backslash einfügen, und danach wieder die Backslash am Anfang und am Ende entfernen... gebastelt aber es funktioniert.

    Das ist jetzt mal die schnelle Lösung wegen dem Zeitdruck. Die andere Möglichkeit schaue ich mir noch weiter in Ruhe an, auf die Schnelle konnte ich da kein funktionierendes Beispiel hinbekommen.

    Vielen Dank nochmals für die Hilfe!

    Code:
    exec sql set restlib.PaketS = (replace((replace((replace(restlib.Request_DocS,'"','\"')),'{\"type\":\"uebertragung\",\"data\":[{','{"type":"uebertragung","data":"[{')),'}]}','}]"}'));

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Da frage ich mich dann doch, wie man eine "krumme" Json Struktur verarbeiten kann.
    Die mir bekannten Methoden der verschiedenen Sprachen, und wie man sieht auch bei SQL, wird damit nicht zurechtkommen.
    Aber: der Kunde ist König.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  11. #11
    Registriert seit
    Nov 2020
    Beiträge
    315
    Ist immer schade und kommt leider viel zu oft vor dass falsche Strukturen vorgegeben werden.
    Egal ob XML oder JSON.
    Da gibt es in fast jeder Programmiersprache super Tools zur Verarbeitung und dann ist man doch wieder gezwungen auf Hammer und Meisel zu wechseln ...

  12. #12
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Frau Meisel ist doch schon lange tot.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. JSON Daten mit SQL auslesen
    By Kerki in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 26-01-21, 10:46
  2. JSON Daten mit JSON_TABLE
    By Peet in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 18-03-20, 13:36
  3. Editcode bei PF nachträglich festlegen/ändern?
    By AndreasH in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 02-09-02, 13:56

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •