Ios 使用Swift的正确json中的值错误

Ios 使用Swift的正确json中的值错误,ios,json,swift,parsing,swift3,Ios,Json,Swift,Parsing,Swift3,我面临着这个奇怪的问题。我必须解析这个json并提取“symbol”、“High”、“low”和“direction”。这是原始的json [{"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_openm

我面临着这个奇怪的问题。我必须解析这个json并提取“symbol”、“High”、“low”和“direction”。这是原始的json

    [{"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}}]
当我在json中解析它时,它正确地获取除“Direction”值之外的所有值,如下所示:

    [{
    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;
        }
我不知道json中的值在解析时是如何变化的,即使其余的值都是正确的。这就是我解析它的方式

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)))


                  //  }
                }
更新:

使用[[String:Any]]后

我仍然得到了错误的方向值,就像这样

    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],
这将解析(并打印)字典第一级中的所有值,以及第二级中键
istemporal
value
的值。所有变量名都以小写字母开头,以符合命名约定

为方便起见,代码使用类型别名

请注意,代码不会使用任何错误处理来检查字典键。如果不能保证所有项都包含所有键和值,则必须使用可选绑定。

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)
}

可怕的代码。在Swift 3中,不要使用
NSDictionary
,也不要使用/cast to
AnyObject
。键
Direction
的值显然是
Int
,而不是字符串。键
bid
的值是一个
Double
,不是一个
Int
,你会失去精度。@vadian但是方向的值是作为字符串传递到json中的,所以你的意思是由于将其解析为字符串而改变了值?对,这是json中的字符串,我的错。@vadian没有问题,那么,我该如何解析它以获得正确的值呢?@ViniApp如果你不知道如何提取键和值,那么你正在使用的工具是不相关的。