Thread Daten aus einer JSON-Response referenzieren (5 answers)
Opened by NickHatBoecker at 2019-06-17 10:22

Gast NickHatBoecker
 2019-06-17 10:22
#190119 #190119
Hallo zusammen,

ich hoffe ich habe hier in den richtigen Bereich geschrieben.
Ich beschäftige mich erst seit Kurzem mit der Programmierung in Perl, da das verwendete Kunden CMS größtenteils darauf basiert. Ich bin eigentlich in der Frontend-Entwicklung und Backend-Entwicklung in PHP Zuhause, daher hoffe ich, dass ihr mir bei meinem Problem helfen könnt.

Situation

Im Backend des CMS soll der Nutzer eine Länderauswahl in einem Select-Feld angezeigt bekommen. Die Länder sollen dynamisch via PERL von einer JSON-Schnittstelle abgefragt werden.
Die JSON-Response sieht folgendermaßen aus (runtergebrochen auf 2 Länder):

Code: (dl )
1
2
3
4
5
6
{
"countries": [
{"id":190,"label":"Afghanistan"},
{"id":2,"label":"\u00c4gypten"}
]
}


Das Problem

Ich schaffe es nicht diese Struktur nun in einfache HTML-Options umzuwandeln, weil ich es nicht schaffe die Daten aus dem Array zu referenzieren.
Ich habe es mit foreach Schleifen versucht, da wurde dann aber nicht durchgelaufen und mit for Schleifen, da kriege ich aber einfach nicht die Array-Länge raus. Siehe folgender Code.

Der Perl-Code

Mein aktueller Code sieht so aus. Ich habe dort nun die for-Schleife auf 1000 Durchläufe gesetzt, weil ich um die 200 Länder habe.
So kann ich sicherstellen, dass kein Land unterschlagen wird. Schöner wäre es aber natürlich, wenn ich einfach die Länge des Länder-Arrays prüfen könnte und dementsprechend die Durchläufe setzen könnte. Das genau funktioniert aber nicht. Ich habe es mit length und scalar und und und probiert, aber nichts funktioniert.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/bin/false
#
# This code include is used to load countries for the flexmodule daad_country_facts.htms from the API.

use strict;
use vars qw(@parameters $new $mode $metainfo);

use Project::Util::Api;

sub main
{
    if ($mode ne 'EDIT') {
        return;
    }

    my @items = _getData();
    if (scalar @items == 0 || ! defined \@items) {
        return "";
    }

    my $html = "";

    # @TODO replace 1000 with actual array length
    for ($a = 0 ; $a <= 1000 ; $a++) {
        if (defined @items[0]->[$a]->{"id"}) {
            # option selection will be automatically set by Imperia
            $html .= sprintf(
                '<option value="%s">%s</option>',
                @items[0]->[$a]->{"id"},
                encode_utf8(@items[0]->[$a]->{"label"}),
            );
        }
    }

    return $html;
}

sub _getData
{
    my $url = sprintf(
        "%s%s",
        $ENV{'API_BASE_URL'},
        "/ajax/imperia/countrylist/de"
    );
 
    my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 1 });
    my $header = HTTP::Request->new(GET => $url);
    my $request = HTTP::Request->new('GET', $url, $header);
    my $response = $ua->request($request);

    if (!$response || $response->is_error || !$response->is_success) {
        return;
    }

    my $response = decode_json($response->content);
    my @items = $response->{"countries"};

    return @items;
}

$new = main();


Ich hoffe sehr, dass ihr mir helfen könnt und bedanke mich schonmal im Voraus.

Viele Grüße
Nick
Last edited: 2019-06-17 11:40:11 +0200 (CEST)

View full thread Daten aus einer JSON-Response referenzieren