2017-09-19 2 views
-2

Ich stehe vor diesem seltsamen Problem. Ich muss dieses json analysieren und "Symbol", "Hoch", "Tief" und "Richtung" extrahieren. Dies ist die ursprüngliche jsonFalscher Wert in korrektem Json mit Swift

[{"ID":101,"Symbol":"PKR","Bid":105.7,"Ask":106,"High":105.7,"Low":106,"Change":0,"Direction":"0","CreateDate":"04:38:26","EntityState":2, 
"EntityKey":{"EntitySetName":"v_openmarketrates","EntityContainerName":"tradebizEntities", 
"EntityKeyValues":[{"Key":"ID","Value":101}], 
"IsTemporary":false}}, 

    {"ID":1,"Symbol":"EUR","Bid":126.696,"Ask":127.327,"High":126.7622,"Low":126.9752,"Change":0.4192,"Direction":"0","CreateDate":"06:37:31","EntityState":2, 
"EntityKey":{"EntitySetName":"v_openmarketrates","EntityContainerName":"tradebizEntities","EntityKeyValues":[{"Key":"ID","Value":1}], 
"IsTemporary":false}}] 

Wenn ich dies in json bin Parsen es alle Werte korrekt außer dem Wert der „Richtung“, wie dies abruft:

[{ 
    Ask = 106; 
    Bid = "105.7"; 
    Change = 0; 
    CreateDate = "04:38:26"; 
    Direction = 0; 
    EntityKey =  { 
     EntityContainerName = tradebizEntities; 
     EntityKeyValues =   (
         { 
       Key = ID; 
       Value = 101; 
      } 
     ); 
     EntitySetName = "v_openmarketrates"; 
     IsTemporary = 0; 
    }; 
    EntityState = 2; 
    High = "105.7"; 
    ID = 101; 
    Low = 106; 
    Symbol = PKR; 
}, 

    { 
      Ask = "127.265"; 
      Bid = "126.623"; 
      Change = "0.3463"; 
      CreateDate = "06:30:46"; 
      Direction = 0; 
      EntityKey =  { 
       EntityContainerName = tradebizEntities; 
       EntityKeyValues =   (
           { 
         Key = ID; 
         Value = 1; 
        } 
       ); 
       EntitySetName = "v_openmarketrates"; 
       IsTemporary = 0; 
      }; 
      EntityState = 2; 
      High = "126.7306"; 
      ID = 1; 
      Low = "126.9752"; 
      Symbol = EUR; 
     } 

ich habe keine Ahnung wie der Wert innerhalb von json während der Analyse geändert wird, obwohl die restlichen Werte korrekt sind. So analysiere ich es.

if let jsonResult = try JSONSerialization.jsonObject(with: data!, options: []) as? [NSDictionary] { 
       print("kerb rates full json = ",jsonResult) 
       for field in jsonResult as? [AnyObject] ?? [] { 
        print("fields of kerb rates = \(field)") 

        print("kerb directions \((field["Direction"] as? String)!)") 

        let subfield : AnyObject = (field["EntityKey"] as? AnyObject)! 
        let sub_subfield : AnyObject = (subfield["EntityKeyValues"] as? AnyObject)! 
        print("sub_subfield = \(sub_subfield)") 
        print("subfields = \(subfield)") 

       // for key_Subfield in sub_subfield as? [AnyObject] ?? [] { 

         print("inside loop!") 
         // converting int and bool values 
         let ask = (field["Ask"] as? Int)! 
         let bid = (field["Bid"] as? Int)! 
         let change = (field["Change"] as? Int)! 
         let EntityState = (field["EntityState"] as? Int)! 
         let High = (field["High"] as? Double)! 
         let ID = (field["ID"] as? Int)! 
         let IsTemporary = ""//(subfield["IsTemporary"] as? Bool)! 
         let Low = (field["Low"] as? Double)! 
         let Value = ""//(key_Subfield["Value"] as? Int)! 


         // it is crashing here due to multple dictionaries 
         self.Save_KerbRates(ask: (String(ask)), 
              bid: (String(bid)), 
              change: (String(change)), 
              createDate: (field["CreateDate"] as? String)!, 
              direction: (field["Direction"] as? String)!, 
              entityContainerName: "",//(subfield["EntityContainerName"] as? String)!, 
              entitiySetName:"",// (subfield["EntitySetName"] as? String)!, 
              entitiyState: (String(EntityState)), 
              high: (String(High)), 
              id: (String(ID)), 
              isTemporary: (String(IsTemporary)), 
              key:"",// (key_Subfield["Key"] as? String)!, 
              low: (String(Low)), 
              symbol: (field["Symbol"] as? String)!, 
              value: (String(Value))) 


        // } 
       } 

Update:

Nach der Verwendung von [[String: Alles]]

Ich bin immer noch den falschen Wert von Richtung bekommen, wie diese

kerb rates full json = [["Low": 106, "Direction": 0, "EntityState": 2, "EntityKey": { 
    EntityContainerName = tradebizEntities; 
    EntityKeyValues =  (
       { 
      Key = ID; 
      Value = 101; 
     } 
    ); 
    EntitySetName = "v_openmarketrates"; 
    IsTemporary = 0; 
}, "ID": 101, "CreateDate": 04:38:26, "Symbol": PKR, "Change": 0, "Ask": 106, "High": 105.7, "Bid": 105.7], ["Low": 126.9752, "Direction": -1, "EntityState": 2, "EntityKey": { 
    EntityContainerName = tradebizEntities; 
    EntityKeyValues =  (
       { 
      Key = ID; 
      Value = 1; 
     } 
    ); 
    EntitySetName = "v_openmarketrates"; 
    IsTemporary = 0; 
}, "ID": 1, "CreateDate": 07:03:46, "Symbol": EUR, "Change": 0.4403, "Ask": 127.349, "High": 126.7654, "Bid": 126.717], 
+4

Schrecklicher Code. Verwenden Sie nicht 'NSDictionary' und verwenden Sie nicht/cast zu' AnyObject' in Swift 3. Der Wert für den Schlüssel 'Direction' ist eindeutig ein' Int', kein String. Und der Wert für den Schlüssel 'bid' ist ein' Double', kein 'Int', wodurch Sie die Präzision verlieren. – vadian

+0

@vadian aber der Wert der Richtung ist in Pässen als String der JSON, also meinst du der Wert wird geändert, weil es als String analysiert? –

+0

Richtig, es ist eine Zeichenfolge in der JSON, mein Schlechter. – vadian

Antwort

0

This Parsen (und druckt alle Werte in der ersten Ebene des Wörterbuchs und den Wert für die Schlüssel IsTemporary und Value in der zweiten Ebene. Alle Variablennamen beginnen mit einem Kleinbuchstaben, um der Namenskonvention zu entsprechen.

Der Code verwendet zur Vereinfachung einen Typalias.

Beachten Sie, dass der Code keine Fehlerbehandlung verwendet, um die Wörterbuchschlüssel zu überprüfen. Wenn nicht garantiert ist, dass alle Elemente alle Schlüssel und Werte enthalten, müssen Sie optionale Bindungen verwenden.

typealias JSONDictionary = [String:Any] 

do { 
    if let jsonResult = try JSONSerialization.jsonObject(with:data!) as? [JSONDictionary] { 

     for field in jsonResult { 

      let ask = field["Ask"] as! Double 
      let bid = field["Bid"] as! Double 
      let change = field["Change"] as! Double 
      let createDate = field["CreateDate"] as! String 
      let direction = field["Direction"] as! String 
      let entityState = field["EntityState"] as! Int 
      let high = field["High"] as! Double 
      let id = field["ID"] as! Int 
      let low = field["Low"] as! Double 
      let symbol = field["Symbol"] as! String 

      let entityKey = field["EntityKey"] as! JSONDictionary 
      let isTemporary = entityKey["IsTemporary"] as! Bool 

      let entityKeyValues = entityKey["EntityKeyValues"] as! [JSONDictionary] 
      let value = entityKeyValues[0]["Value"] as! Int 
      print(ask, bid, change, createDate, direction, entityState, high, id, low, symbol, isTemporary, value) 
     } 

    } 
} catch { 
    print(error) 
}