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

Linuxer
 2019-06-17 13:07
#190121 #190121
User since
2006-01-27
3870 Artikel
HausmeisterIn

user image
Wie rosti schon schrieb, könntest Du die Datenstruktur direkt in ein Template-System geben.
Wenn Du es per Hand machen willst:

1. Die Variablen $a und $b sind für Perldoc:perlfunc sort vordefiniert und sollten auch nur im sort benutzt werden; gewöhn es Dir nicht an, sie anderweitig zu verwenden... Das kann je nach Verwendung Probleme machen.

2. Den letzten Index eines Array erhälst Du mit der Schreibweise $#array.

3. Unter "countries" steht eine Array-Referenz, kein Array. Ich würde das nicht in ein Array @items schieben, sondern direkt verwenden.

4. Ein Zugriff auf @items[0] sollte Dir eine Warnung ausgeben, wenn Du dieseWarnungen eingeschaltet hast.
Bei Zugriff auf ein Element schreibt man ein $; also $items[0]; bei mehreren dann das @; z.B. @items[0,1,2].

5. Verwende bitte immer use strict und use warnings. Die beiden helfen Dir beim Programmieren.



Hier ein ungetesteter Fix-Versuch Deines Codes:

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
sub main {
    if ($mode ne 'EDIT') {
        return;
    }

    # Receive an array reference
    my $countries = _getData();
    if ( 0 == scalar @$countries ) {
        return "";
    }

    my $html = "";

    # $#{$countries} is last index of array reference $countries
    for (my $i = 0 ; $i <= $#{$countries} ; $i++) {
        if (defined $countries->[$i]->{"id"}) {
            # option selection will be automatically set by Imperia
            $html .= sprintf(
                '<option value="%s">%s</option>',
                $countries->[$i]->{"id"},
                encode_utf8($countries->[$i]->{"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);
    return $response->{"countries"};
}


edit: kleinere Textänderung
Last edited: 2019-06-17 17:07:52 +0200 (CEST)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread Daten aus einer JSON-Response referenzieren