Wie mit einem JSON Object eines REST Calls umgehen?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Qvex23 schrieb:

    for var configItem in json["ConfigItem"] as! [AnyObject]{dict = configItem["CIXMLData"] as! NSDictionary}
    Diese as! -Ausdrücke - überhaupt !, also forced unwrapps - sollte man, ich wiederhole mich da, meiden wie der Teufel das Weihwasser. Man sagt damit, daß man es meint besser zu wissen als der Compiler, und wenn dem nicht so ist, oder Daten korrupt sind, dann fliegt einem das ganze um die Ohren.

    Hier ein paar Demozeilen, die veranschaulichen, wie solche Casts gefahrlos aussehen können:

    Quellcode

    1. var array: [Any] = [1, 2, "a", ["x": 10, "y": 11, "z": 12], "b", 0.5]
    2. for case let item as [String: Any] in array {
    3. print("item:", item)
    4. guard let element = item["x"] as? Int else { continue }
    5. print("element:", element)
    6. }
    7. // item: ["y": 11, "x": 10, "z": 12]
    8. // element: 10
    Alles anzeigen
    Twix heißt jetzt Raider!
  • Qvex23 schrieb:

    Und wenn es sonst niemanden stört würde ich bei Problemen gerne wieder hier nachfragen.
    Wenn eine Antwort etwas sehr knapp ist, kann das einfach ein Zeichen sein, dass unter dem Stichwort das betreffende Problem in der Doku beschrieben ist. Kein Beinbruch. Einfach mal nachschauen.

    Der Umgang ist hier zeitweise etwas rustikal, aber herzlich. Daher hab keine Scheu.

    Ansonsten: Herzlich Willkommen.
    * Kann Spuren von Erdnüssen enthalten.
  • Qvex23 schrieb:

    nussratte schrieb:

    Wäre wohl gut erstmal zu wissen wie etwas funktioniert bevor man es sich von anderen abnehmen lässt
    Und Leute wie du sind immer sehr hilfreich in Foren die unter anderem dazu da sich mit Problemen an andere zu wenden. Auch wenn im Rückblick das Problem banal war. Ich wünsche dir das du nie Hilfe benötigst!
    bevor du rumblubberst wie ein kleines beleidigtes Kind solltest du den Sinn erstmal verstehen
    mein Text bezog sich nämlich nicht auf dich sondern auf den Framework vorschlag von adiminator
    Ich weiß nicht immer wovon ich rede aber ich weiß das ich Recht habe. :saint:
  • nussratte schrieb:

    Qvex23 schrieb:

    nussratte schrieb:

    Wäre wohl gut erstmal zu wissen wie etwas funktioniert bevor man es sich von anderen abnehmen lässt
    Und Leute wie du sind immer sehr hilfreich in Foren die unter anderem dazu da sich mit Problemen an andere zu wenden. Auch wenn im Rückblick das Problem banal war. Ich wünsche dir das du nie Hilfe benötigst!
    bevor du rumblubberst wie ein kleines beleidigtes Kind solltest du den Sinn erstmal verstehenmein Text bezog sich nämlich nicht auf dich sondern auf den Framework vorschlag von adiminator
    Das kann ich nur zurück geben. Auf was du dich genau beziehst mag in deinem Kopf klar gewesen sein, aber in deinem Text gab es da keine Hinweise drauf. Trotzdem Danke für deine Hilfe
  • Qvex23 schrieb:

    torquato schrieb:

    Diese as! -Ausdrücke - überhaupt !, also forced unwrapps - sollte man, ich wiederhole mich da, meiden wie der Teufel das Weihwasser
    witzig, bei mir meckert der Compiler das er diese forced unwrapps bräuchte, sonst kompiliert das gar nicht erst.
    Der Compiler ist eine fiese 'billige' Hure, die möglichst schnell ans Ziel will. :D

    Forced unwraps führen sehr schnell ans Ziel. Der Compiler erzählt Dir aber auch nicht die ganze Geschichte. Wichtig ist es aber, die ganze Geschichte zu kennen... ^^
    b
    Twix heißt jetzt Raider!
  • Aber was soll ich denn dann tuen, wenn es ohne nicht kompiliert?
    Was mich auch verwirrt: in der for schleife steht ein var und der Compiler meint ich würde den ja nie "mutated" werden und ich soll es auf let ändern, aber ein let meckert der Compiler an mit: "let pattern cannot appear nested in an already immutable context". Mir war schon klar das ein let da nicht gehen dürfte, aber WAS ERLAUBE APPLE?? So kenne ich XCode irgenwie nicht mehr, das war mal besser gefühlt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Qvex23 ()

  • Qvex23 schrieb:

    Aber was soll ich denn dann tuen, wenn es ohne nicht kompiliert?

    Weiter lernen. Ratschläge annehmen. Überdeken. Experimentieren. Dokumentation lesen...

    Und *seufz* alles über den Haufen werfen und wieder von vorne Anfangen... ;)

    Ähhh... Und ja, natürlich so ein forced unwrapped kann kurzfristig mal ganz nützlich sein, um eine Geschichte auszutesten...
    Twix heißt jetzt Raider!
  • Thallius schrieb:

    Qvex23 schrieb:

    Aber was soll ich denn dann tuen, wenn es ohne nicht kompiliert?
    Nimm Objective-C, dass kapiert ein "normal" denkendes menschliches Gehirn wenigstens noch....

    SCNR

    Claus


    Genau. Denn es ist ein riesen - ein RIESEN - Vorteil, wenn etwas erst zur Laufzeit abraucht, anstatt schon zur Compile-Time zu meckern. Leben wir lieber in Objective-C zur Laufzeit unsicher, als mit Swift zur Compile-Zeit Sicherheit zu gewinnen...
    Twix heißt jetzt Raider!
  • torquato schrieb:

    Genau. Denn es ist ein riesen - ein RIESEN - Vorteil, wenn etwas erst zur Laufzeit abraucht, anstatt schon zur Compile-Time zu meckern. Leben wir lieber in Objective-C zur Laufzeit unsicher, als mit Swift zur Compile-Zeit Sicherheit zu gewinnen...
    Geb ich Dir prinzipiell erst mal Recht. Alles was der Compiler findet, muss ich schon mal nicht finden. Prima!

    Aaaber: In meinen ganzen 15 Jahren als Mac-Entwickler ist mir noch nie beim Kunden eine Anwendung um die Ohren geflogen weil ein Typecast fehlerhaft war (z.B. falsche Objekte in einem NSArray oder NSDictionary). Insofern ist das ganze strenge Casten in Swift für mich eine Lösung für ein Problem was ich nie hatte.

    Meiner Erfahrung nach gibt's zwei Hauptursachen für Fehler in Produktivsoftware:

    1. Fehler im Algorithmus, also ein klassischer Programmierfehler. Da nützt einem Swift auch nix.

    2. Speicherfehler (z.b bei den Bindings)
  • Ich habe zu dem Dictionary noch eine Frage. Je nach dem welche Geräteklasse ich abrufe, bekomme ich evtl. ein nested dictionary zurück. Ich würde gerne dies nested Dictionarys in einer Tabelview darstellen. Ich habe dazu schon dies gefunden: jotlab.com/2015/ios-displaying…rarchical-data-with-swift
    Allerdings geht der Code davon aus das es statische Keys gibt, die habe ich aber leider nicht. Hat jemand noch eine andere Idee?
  • Neu

    Hehe.... die Antwort hätte fast von mir stammen können :thumbup:
    Habe ich natürlich schon versucht:

    for var obj in dict.allKeys { print(type(of: obj)) }
    Das Ergebnis ist:
    __NSCFString
    NSTaggedPointerString
    NSTaggedPointerString
    NSTaggedPointerString
    NSTaggedPointerString
    NSTaggedPointerString
    NSTaggedPointerString
    __NSCFString
    __NSCFString
    __NSCFString
    __NSCFString
    NSTaggedPointerString
    __NSCFString
    NSTaggedPointerString
    __NSCFString
    NSTaggedPointerString
    __NSCFString
    __NSCFString

    und das blöde daran ist, das einige eintrage darin eigentlich wieder dictionarys sind, aber man nicht sagen kann das immer wenn z.B. ein NSTaggedPointerStr kommt das eigentlich ein dictionary ist.

    Der Inhalt des NSDictionarys sieht so aus:

    {
    CIXMLData = {
    AllIPAddresses = "192.168.299.359 192.168.299.369 fe80::f987:12e4:asdf:asdf6";
    AssignedCompany = 13003;
    CPU = "Intel(R) Xeon(R) CPU E31220 @ 3.10GHz(3100 MHz)";
    FQDN = WORKGROUP;
    HardDisk = (
    {
    Capacity = "238.47 GB";
    HardDisk = "Samsung SSD 840 PRO Series ATA Device (238.5 GB)";
    },
    "",
    "",
    "",
    ""
    );
    IPAddress = (
    "192.168.299.369",
    "192.168.299.359",
    "fe80::f987:12e4:asdf:asdf6"
    );
    Model = "aModellYouDontKnow";
    NIC = (
    {
    IPoverDHCP = No;
    MACAdress = "";
    NIC = "[00000007] HP NC112i 1-port Ethernet Server Adapter ";
    },
    {
    IPoverDHCP = No;
    MACAdress = "";
    NIC = " [00000010] HP NC112i 1-port Ethernet Server Adapter";
    },
    "",
    "",
    ""
    );
    NumberOfCPUCores = 4;
    NumberOfPhysicalCPU = 1;
    OperatingSystem = "Microsoft Windows Web Server 2008 R2";
    Ram = "16349.8";
    SerialNumber = CZ2323412354HV67HDC76540752;
    Type = Server;
    Vendor = HP;
    };
    Class = Computer;
    ConfigItemID = 12;
    CreateBy = 3;
    CreateTime = "2017-02-08 10:08:42";
    CurDeplState = Production;
    CurDeplStateType = productive;
    CurInciState = Operational;
    CurInciStateType = operational;
    DefinitionID = 41;
    DeplState = Production;
    DeplStateType = productive;
    InciState = Operational;
    InciStateType = operational;
    LastVersionID = 20;
    Name = "NoneYouKnowOf";
    Number = 002200005342;
    VersionID = 20;



    Ich glaube ich verkacke da schon was beim umwandeln vom diesem bescheuerten JSON Object.... X(

    Gruß

    Dirk
  • Neu

    Sally me. Danke für den Hinweis!
    Die Values sind natürlich das worin die anderen Dictionarys sich befinden. Nun sieht die Ausgabe so aus:
    __NSCFString NSTaggedPointerString NSTaggedPointerString __NSDictionaryI __NSCFString __NSCFString __NSCFString __NSCFString __NSCFString NSTaggedPointerString NSTaggedPointerString NSTaggedPointerString __NSCFString __NSCFString NSTaggedPointerString NSTaggedPointerString __NSCFString NSTaggedPointerString

    Dazu habe ich noch eine blöde Frage: Welcher Typ ist denn __NSDictionaryI? Xcode kennt den Type so nicht, und die Prüfung on es ein NSDictionay ist klappt auch nicht. Ich laufe in einer Schleife durch alle Values und prüfe auf den Typ NSDictionary:
    if type(of: dict.allValues) == NSDictionary.self