[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jan 2019
    Beiträge
    36

    Verschachteltes JSON mit SQL

    Hallo zusammen.

    Ich habe folgendes SQL:

    EXEC SQL SELECT
    json_object('Confirmation':
    json_object(
    'Datum': date, 'Header':
    json_object(
    'company': company,
    'delivery_line': json_arrayagg(
    json_object(
    'package_number': trim(xpackage_no),
    'country_of_origins': json_array(
    json_object(
    'country_of_origin': trim(country_from,
    'quantity_picked': trim(quan))))))))

    INTO :jsonfile
    FROM qtemp/jsonout
    group by company;

    Bei folgenden Daten:

    date company xpackage_no country_from quan
    20230901 123 12345 DE 5
    20230901 123 12345 AT 1

    bekomme ich folgendes JSON:
    Code:
    {
        "Confirmation": {
            "Datum": "20230901",
            "Header": {
                "company": "123    "
            },
            "delivery_line": [
                {
                    "package_number": "12345",
                    "country_of_origins": [
                        {
                            "country_of_origin": "DE",
                            "quantity_picked": "5"
                        }
                    ]
                }
            ]
            "delivery_line": [
                {
                    "package_number": "12345",
                    "country_of_origins": [
                        {
                            "country_of_origin": "AT",
                            "quantity_picked": "1"
                        }
                    ]
                }
            ]
        }
    }
    ich möchte das JSON aber folgendermaßen formatiert haben:
    Code:
    {
        "Confirmation": {
            "Datum": "20230901",
            "Header": {
                "company": "123    "
            },
            "delivery_line": [
                {
                    "package_number": "12345",
                    "country_of_origins": [
                        {
                            "country_of_origin": "DE",
                            "quantity_picked": "5"
                        }
                        {
                            "country_of_origin": "AT",
                            "quantity_picked": "1"
                        }
                    ]
                }
            ]
        }
    }
    Was muss ich dazu ändern? Irgendwie klappt das bei mir nicht.

    Schon mal vielen Dank und Gruß
    Sebastian

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Bei "'Name' value" kann ein "(select...)" oder "JSON_OBJECT" wieder folgen.

    https://www.ibm.com/docs/en/i/7.2?to...enerating-json
    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

  3. #3
    Registriert seit
    Apr 2019
    Beiträge
    43
    Hi,

    es gibt ein Problem bei delivery_line: nach Company muss noch eine Klammer zu hinzugefügt werden..
    Und zum Array:
    Da kann man sich mit einem weiteren select + Json_arrayagg weiterhelfen. Sollte in etwa so aussehen:

    Code:
    json_object('Confirmation':
    json_object(
    'Datum': date, 'Header':
    json_object(
    'company': company),
    'delivery_line': json_arrayagg(
    json_object(
    'package_number': trim(xpackage_no),
    'country_of_origins': 
    (select json_arrayagg(
      json_object(
        'country_of_origin': trim(country_from),
        'quantity_picked': trim(quan)
       )
     )
    from qtemp/jsonout b 
    where a.date = b.date and 
               a.company = b.company and
              a.xpackage_no = b.xpackage_no
    ) format json
    ))))
    
    INTO :jsonfile
    FROM qtemp/jsonout a
    group by date, company;

  4. #4
    Registriert seit
    Jan 2019
    Beiträge
    36
    Vielen Dank für die Antworten!

    @xenofob

    ich habe das so umgesetzt und bekomme nun aber folgendes raus (nicht wundern das die Werte nicht gleich sind. Im Beispiel oben hatte ich ausgedachte Felder und Werte und nun die aus einem Testauftrag):
    Code:
    "country_of_origins": "[{\"country_of_origin\":\"IT\",\"quantity_picked\":\"200\"},{\"country_of_origin\":\"SI\",\"quantity_picked\":\"10\"}]"
    Der Inhalt sieht soweit erstmal gut aus aber es scheint, dass er das ganze nun als ein VALUE behandelt und nicht als JSON Format. Zumindest ist der ganze Teil in ""

    Wo mache ich noch was falsch?

    Gruß
    Sebastian

  5. #5
    Registriert seit
    Nov 2020
    Beiträge
    331
    Dafür ist die Syntax "format json" zuständig, das es als JSON hineingebettet wird.

  6. #6
    Registriert seit
    Jan 2019
    Beiträge
    36
    Erstmal vielen dank! Das "format json" hat geholfen.


    Jetzt habe ich nur noch ein Problem. Meine Ausgabe sieht jetzt folgendermassen aus:
    Code:
    {
        "Confirmation": {
            "Datum": "20230901",
            "Header": {
                "company": "123    "
            },
            "delivery_line": [
                {
                    "package_number": "12345",
                    "country_of_origins": [
                        {
                            "country_of_origin": "DE",
                            "quantity_picked": "5"
                        }
                        {
                            "country_of_origin": "AT",
                            "quantity_picked": "1"
                        }
                    ]
                }
            {
                    "package_number": "12345",
                    "country_of_origins": [
                        {
                            "country_of_origin": "DE",
                            "quantity_picked": "5"
                        }
                        {
                            "country_of_origin": "AT",
                            "quantity_picked": "1"
                        }
                    ]
                }
            ]
        }
    }
    Heisst ich habe nun 2 mal diesen Block weil ich ja in der Datendatei 2 Sätze habe. Hab schon verschiedenes versucht aber er fasst mir diese nicht zusammen.

    EDIT: Habe jetzt selbst eine Lösung gefunden, indem ich jeweils noch einen zusätzlichen Eintrag mit country_of_origin = *BLANK und quantity_picked = *BLANK hinzufüge und setze dann dem FROM qtemp/jsonout a ein WHERE country_of_origin = *BLANK und bei dem eingebettenten SELECT ein where country_of_orign <> *BLANK. Trotzdem würde mich noch eine saubere SQL Lösung interessieren.

    Gruß
    Sebastian

  7. #7
    Registriert seit
    Apr 2019
    Beiträge
    43
    Das sollte nicht so aussehen.
    Kannst du den aktuellen sql posten?

Similar Threads

  1. IWS Server mit SQL und Multirow JSON/XML als Input
    By Andreas_Prouza in forum IBM i Hauptforum
    Antworten: 10
    Letzter Beitrag: 18-01-23, 14:30
  2. SQL-Funktionen in SYSTOOLS, kennt jemand die json-Funktionen?
    By dschroeder in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 09-09-22, 12:23
  3. IWS nested JSON bei POST Aufruf mit SQL verarbeiten
    By ismiavoiwuascht in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 17-10-21, 21:17
  4. JSON Daten mit SQL auslesen
    By Kerki in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 26-01-21, 09:46
  5. verschachteltes SQL
    By Armin in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 31-05-07, 11:38

Berechtigungen

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