【问题标题】:how can I retrieve individual values from a multi value key in Swift 4/json dictionary?如何从 Swift 4/json 字典中的多值键中检索单个值?
【发布时间】:2019-01-05 19:54:12
【问题描述】:

检索键值的例子有很多,我可以做到。在这种情况下,键有多个值。关键是“挖矿”,后面跟着6个值。同一个 key:value 重复 30 次,当然 key 的值不同。

我似乎无法解决的是如何返回值。尤其是第一个,例如 1532825277682891390,它似乎是一个带有与其相关的键/值对的子键。

The todo is: ["mining": {
1532825277682891390 =     {
    command = mining;
    siteid = "Platform Mining";
    ts = 1532825270557;
    user1 = 73276;
    value = 1;
};
1532826406100318457 =     {
    command = mining;
    siteid = "Platform Mining";
    ts = 1532826375712;
    user1 = 73276;
    value = 1;
};
1532827074955562013 =     {
    command = mining;
    siteid = "Platform Mining";
    ts = 1532827066645;
    user1 = 73276;
    value = 1;
};
153282775791322835 =     {
    command = mining;
    siteid = "Platform Mining";
    ts = 1532827753205;
    user1 = 73276;
    value = 1;
};

....
....
....
}

我可以显示“挖掘”键的键:值。字典里只有两个键,'mining'和'success'——我不担心'success',它通常返回'1'。

这基本上是带有一些示例和试验输出的代码,因为我尝试了与其他帖子不同的东西。我只是无法理解这一点。 我是否需要将字典放入数组中,我该怎么做,或者我可以将每个值放入 var 中,这样我就可以将它们打印到 UITabDisplay 中?

    func makeGetCall() {
    // Set up the URL request
    let todoEndpoint: String = "https://api.jsecoin.com/v1.7/mining/auth/"

    let apiKey = "xxxxxxxxxxxxxxxxxxxxxxx"


    guard let url = URL(string: todoEndpoint) else {
        print("Error: cannot create URL")
        return
    }
    var urlRequest = URLRequest(url: url)

    urlRequest.setValue(apiKey, forHTTPHeaderField: "Authorization")
    urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
    // set up the session
    let config = URLSessionConfiguration.default
    let session = URLSession(configuration: config)

    // make the request
    let task = session.dataTask(with: urlRequest) {
        (data, response, error) in
        // check for any errors
        guard error == nil else {
            print("error calling GET on /todos/1")
            print(error!)
            return
        }


        // make sure we got data
        guard let responseData = data else {
            print("Error: did not receive data")
            return
        }
        print("Got data: \(responseData)")
        // parse the result as JSON, since that's what the API provides
        do {
            guard let todo = try JSONSerialization.jsonObject(with: responseData, options: [])
                as? [String: Any] else {
                    print("error trying to convert data to JSON")
                    return
            }
            // now we have the todo
            // let's just print it to prove we can access it
           print("The todo is: " + todo.description)

           // from this point on I"m experimenting ....

            let dict = todo.description
            print("The dict is: " + dict)

            let keys = Array(todo.keys)
            // prints ["mining", "success"]
            print(keys)
            /////////////////////////////////
            if let alb = todo["mining"] {
                // prints all the values for 'mining'.
               //  {
               //   1532825277682891390 =     {
               //   command = mining;
               //   siteid = "Platform Mining";
               //   ts = 1532825270557;
              //    user1 = 73276;
              //    value = 1;
             //    };
             // ........ 30 entires
                print(alb)
            }
            //======================
            let index1 = todo.index(forKey: "mining")
            let myMining = (todo[index1!].value)

            // again prints all the mining values. Mining: {
            // 1532825277682891390 =     {
            // command = mining;
            // siteid = "Platform Mining";
            // ts = 1532825270557;
            // user1 = 73276;
            // value = 1;
            // };

            print("Mining: \(myMining)")

            //============ 

【问题讨论】:

    标签: ios json dictionary swift4


    【解决方案1】:

    您可以按照您为获取 todo 字典的键而编写的类似方式进行操作。

    if let mining = todo["mining"] as? [String: Any] {
       let miningKeys = Array(mining.keys)
       // It will be like [1532825277682891390, 1532826406100318457]
    }
    

    使用miningKeys 访问该挖掘字典中的值,例如:

    mining[miningKeys.first!]
    // It will return
    // {
    //   command = mining;
    //   siteid = "Platform Mining";
    //   ts = 1532825270557;
    //   user1 = 73276;
    //   value = 1;
    // }
    

    【讨论】:

    • 这个返回这个。 Optional({ command = mining; siteid = "Platform Mining"; ts = 1532866600000; user1 = 73276; value = 1; }) 所以我现在的大问题是,如何从每个子键中提取每个值..我的var 'command' = '挖矿'?
    • 这对我理解它的工作原理也有很大帮助。我从另一个答案中了解到,我应该查看 Codable。我会开始的。
    • @HarryMcGovern 感谢您的评论。是的,您应该使用 Codable 并定义一个模型类来存储/使用数据。
    【解决方案2】:

    mining 的值是一个字典。有条件地将alb 向下转换为预期类型并枚举字典

    if let alb = todo["mining"] as? [String:Any] {
        for (key, value) in alb {
            print(key, value)
        }
    }
    

    如果你想单独打印内部字典的每个键值对,你可以使用

    if let alb = todo["mining"] as? [String:Any] {
        for (key, mining) in alb {
            print(key)
            if let item = mining as? [String:Any] {
               for (key, value) in item {
                   print(key, value)
               }
            }
        }
    }
    

    请注意,for 循环中的 keys 不能保证与 JSON 中的顺序相同。

    【讨论】:

    • 所以这个返回 1532866606309208293 { command = mining; siteid = "平台挖矿"; ts = 1532866600000;用户 1 = 73276;值 = 1; }
    • 你期待什么?该代码应该打印每个键值对。
    • 谢谢,是的,但我要做的是打印或存储在 var 中,用于密钥挖掘的值,如 1532866606309208293,然后是子键,如 key: 命令值:挖掘键:siteid 值:“平台挖掘”键:ts 值:1532866600000 所以我可以参考这些单独的子键。
    • 好的,现在我理解得更好了。尽管出于某种奇怪的原因,它没有以相同的顺序打印结果,但它正在打印它们。现在将这些结果放入变量中。也许在一个数组中。更新的示例输出。 1532858686602513919 siteid Platform Mining user1 73276 value 1 command Mining ts 1532858680593 示例正常顺序。 1532858686602513919 = { 命令 = 挖矿; siteid = "平台挖矿"; ts = 1532858680593;用户 1 = 73276;值 = 1;
    • 请阅读我回答的最后一句话。字典根据定义是无序的。我建议使用 Codable 协议将 JSON 解析为结构。
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多