Json mit javascipt bearbeiten

  • Hey,


    ich habe ein Problem, welches ich trotz googeln nicht lösen kann.

    Ich hole nun von der Seite http://api.zippopotam.us den Ortsnamen anhand der plz und ich bekomme Json als Format zurück.


    So siehts aus:

    Code
    {"post code": "69115", "country": "Germany", "country abbreviation": "DE", "places": [{"place name": "Heidelberg", "longitude": "8.6868", "state": "Baden-W\u00fcrttemberg", "state abbreviation": "BW", "latitude": "49.4062"}]}

    Nun habe ich erstmal dieses json geparst mit json.parse(). Da bekomme ich aber ausgegeben object object. Also keine weitere Daten mehr. Und wenn ich versuche dies weiterzuverarbeiten funktioniert der Code nichtmehr.


    Mein Code:

    Habe dann versucht mit dem untenstehenden code den Wert auszugeben, jedoch wird dann nix mehr ausgegeben.

    JavaScript
    var wohnort = data.places[0].[place name];
    alert(wohnort);
  • Problem gelöst.


    JavaScript
    var data = data['places'][0]['place name'];

    Noch ne Frage:


    Ich habe folgenden Code:

    Ich habe den keyup eventListener ja auf die funktion getJson() intialisiert. Nun wird aber erst der Name des Ortes nach dem neu laden der Seite angezeigt ?

  • Code
    data.places[0].[place name];

    Da sind zwei Syntaxfehler:

    1. Der Punkt ist zuviel.
    2. Da place name keine Variable ist, sondern ein String und weil es ein Leerzeichen enthält, muss es in Hochkommas eingeschlossen werden.

    So funktioniert es:

    Code
    var wohnort = data.places[0]["place name"];

    1. Möglichkeit, ein Element in einem Objekt anzusprechen:

    data.country

    2. Möglichkeit:

    data["country"]

    diese Möglichkeit funktioniert auch, wenn der Schlüssel in einer Variablen steht:

    Code
    var key = "country";
    var country = data[key];

    Mit der 1. Möglichkeit funktioniert dies nicht.

  • Hey,


    ok alles klar. Ich wusste nur nicht, dass man in javascript objekte auch so ansprechen kann wie arrays in php.


    Trotzdem Danke.


    Ich habe noch ein Problem wo ich nicht weiß warum das so ist. Ich führe bei keyup die function getJson() aus.


    Da soll dann doch sofort der wohnort in dem Feld angezeigt werden und nicht erst nach dem absenden des Formulares.


    Mein akutelles Script dazu:

  • Häufiger Fehler:

    Code
    plz.addEventListener("keyup", getJson());

    Was passiert: Da der Funktionsname getJson von einem Klammernpaar gefolgt wird, wird die Funktion sofort ausgeführt und ihr Rückgabewert zugewiesen. Das Klammernpaar muss man weg lassen, dann wird eine Referenz der Funktion zugewiesen:

    Code
    plz.addEventListener("keyup", getJson);

    Außerdem ist es ungünstig, hier das keyup-Event zu verwenden, da dieses ja bei jedem Tastendruck feuert, so dass die Auswertung fehl schlägt, wenn noch keine fünf Zeichen eingegeben wurden. Besser "change" verwenden oder prüfen, ob schon fünf Ziffern eingegeben wurden.

  • Ach ja.. diesen Fehler mache ich oft. Muss ich mir abgewöhnen. Danke.

    Ja da hast du recht. Change greift dann erst, wenn was verändert wurde ?


    Noch 1ne Sache.


    Ich füge, wenn die length von der plz ungleich 5 ist, eine Klasse hinzu die den Border des input feldes rot werden lässt. Aber wenn ich nun wieder 5 eingebe geht der rote rahmen nicht weg. Warum ist dass denn so? Ich entferne die Class ja wieder wenn die plz.length gleich 5 ist.


  • Zwei Probleme:

    1. In Zeile 24 bist Du schon im else-Zweig der Abfrage if(plz.length === 5), d. h. die Länge ist in jedem Fall ungleich 5 und Du kommst nie in den else-Zweig in Zeile 32 hinein.

    2. Die Variable "plz" ist doppelt belegt, einmal mit dem DOM-Element und dann mit dessen Value. Besser dem Value einen anderen Namen geben, z. b. "plzval".


    So funktioniert es:

    Ich habe, statt nur die Länge abzufragen, mit einer Regex zusätzlich geprüft, ob die Eingabe auch nummerisch ist.

    Zitat

    Change greift dann erst, wenn was verändert wurde ?

    Change triggert dann, wenn die Eingabe mit Enter bestätigt wurde. Keyup oder Input haben jedoch den Vorteil, dass man den Wert während der Eingabe überprüfen kann, so wie es jetzt der Fall ist.

  • Ouh ok. Ja da hast du recht. War nicht gut von mir. Muss ich mehr darauf achten.

    Mit dem preg_match ist eine gute Idee. Wieso komm ich nicht auf so gute Ideen.


    Frage zum PregMatch um es zu verstehen:

    match(/[0-9]{5}/) -> die / sagen aus das es beginnt und es beendet. In den [] stehen dann die zugelassenen Zahlen und in der {} Klammer steht dann die Länge der zugelassenen Zahl. Stimmt das so ?


    Ok. Kaum jemand klickt heutzutage um ein formular abzusenden enter. Darum habe ich mich auch für keyup entschieden.


    Vielen Dank :) TOP Hilfe !


    Habe es so durch deine Hilfestellung gelöst:

  • Zitat

    match(/[0-9]{5}/) -> die / sagen aus das es beginnt und es beendet. In den [] stehen dann die zugelassenen Zahlen und in der {} Klammer steht dann die Länge der zugelassenen Zahl. Stimmt das so ?

    Korrekt. Zu Regex findet man sehr viel im Netz, auch Online-Tester als Hilfe beim Entwickeln.

  • Der Lösungsweg mit dem .match("muster") ist doch nicht so gut.


    Ich habe mal getestet was passiert, wenn man mehr als 5 Zahlen eingibt. Das Resultat war, dass immernoch der Ort der vorher eingegebene 5 Zahlen angezeigt wird, obwohl es diese PLZ (mit mehr als 5 Zeichen) garnicht geben kann.


    Habe dann doch die Variante mit length genommen. Wenn einer nun auf die Idee kommt und gibt dort Buchstaben ein, wird ja schließlich nix angezeigt bei Wohnort. Denn die Suche erfolgt mit Hilfe der PLZ.


    Script:

  • Zitat

    Der Lösungsweg mit dem .match("muster") ist doch nicht so gut.

    Das möchte ich entschieden bezweifeln. Das Problem ist, dass die Regex passt, wenn irgendwo fünf Ziffern hintereinander stehen. Das ist dann auch der Fall, wenn die Eingabe sechs, sieben oder hundert Ziffern enthält.

    Die Regex kann man sehr leicht anpassen, so dass nicht weniger und nicht mehr als fünf Zeichen vorhanden sein dürfen:

    Code
    if (plzval.match(/^[0-9]{5}$/))

    Funktioniert bei mir, probiere es aus.

  • Ok. Ich nehme es zurück.Du hast dort grad ^ und $ hinzugefügt


    Habe mal gegoogelt.


    ^ steht für: Beginn einer Zeichenkette

    $ steht für: Ende einer Zeichenkett


    Also sagt man dann damit, dass das Erwartete eine Zahl die 5 Nummern lang sein muss ist. ^ und $ vor und hinter den vorgaben sagen dann aus, dass nach den 5 Nummern schluss ist.

  • Zitat

    Also sagt man dann damit, dass das Erwartete eine Zahl die 5 Nummern lang sein muss ist. ^ und $ vor und hinter den vorgaben sagen dann aus, dass nach den 5 Nummern schluss ist.

    Genau. Oder anders gesagt, die Regex passt, wenn zwischen Anfang und Ende genau fünf Ziffern stehen.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!