【问题标题】:Dictionary which has multiple dictionary corresponding to one key Swift具有多个字典对应一键Swift的字典
【发布时间】:2019-04-14 19:29:36
【问题描述】:

我的数据库中有以下格式数据(这些数据块中至少有 100,000 个):

{
  "ax" : 1.232,
  "ay" : 1.897,
  "az" : -0.232
  "timestamp" : 151232326789
 }

我在我的 iOS 应用程序中以字典格式检索并解析为类模型。 以上数据来自传感器 MPU6050,与 firebase usgin NodeMCU 通信。由于 NodeMCU 没有自己的时钟,因此使用 ServerValue.Timestamp 为数据提供时间戳是唯一的选择。因此,我无法正确构建我现在需要在我的 iOS 应用程序上格式化的 JSON 数据。

我正在从我的数据库中的时间戳中提取time 和date

这是我在前端需要的格式:

{
  Date1 : {
          Time1 :{ 
                "ax" : 1.232,
                "ay" : 1.897,
                "az" : -0.232
                  },
          Time2 :{ 
                "ax" : 1.232,
                "ay" : 1.897,
                "az" : -0.232
                  },
          Time3 :{ 
                "ax" : 1.232,
                "ay" : 1.897,
                "az" : -0.232
                  },
          Time4 :{ 
                "ax" : 1.232,
                "ay" : 1.897,
                "az" : -0.232
                  }
            }
  Date2 : {...similar as above.}
   }

我尝试使用NSMutableDictionary,但数据变得混乱。有什么解决办法吗?

【问题讨论】:

  • 从哪里获得 Date1、Date2... 值?

标签: ios json swift dictionary swift4.2


【解决方案1】:

字典无法解决您的问题。您需要的是自定义模型数组。

例如,

struct Time {
    var ax: Float
    var ay: Float
    var az: Float
}

struct Date {
    var times: [Time]
}

let array: [Date] = ... // parse your json into this

您需要将 json 的解析逻辑写入此结构中,这可以通过多种方式完成,我相信这超出了初始问题的范围

【讨论】:

    【解决方案2】:
    • jsonResponse 是你的数组

              if let dictionary = jsonResponse as? [String : Any]
              {
      
                          let all=dictionary["Date1"] as? [[String : Any]]
                           if let all = all
                           {
      
                              let user:[String:Any]=all[0]["Time1"]! as! [String : Any]
                              let user2:[String:Any]=all[0]["Time2"]! as! [String : Any]
      
                              print(user["ax"] as? String)!,user["ay"] as? String)!,user["az"] as? String)!)                          
                              print(user2["ax"] as? String)!,user2["ay"] as? String)!,user2["az"] as? String)!)                            
      
                           }
      
              }
      

    【讨论】:

      【解决方案3】:

      我会将其构建为一个实体,将某个日期的传感器数据保存在一个数组中,并将该实体的实例存储在一个数组中,因为字典是未排序的。

      var allData: [OneDayData]
      
      struct OneDayData {
          var date: Date
          var sensorData: [SensorData]
      }
      
      struct SensorData {
          var time: String
          var ax: Double
          var ay: Double
          var az: Double
      }
      

      注意,我不知道你是如何转换时间戳的,所以我只是假设它被转换为日期和字符串

      【讨论】:

        【解决方案4】:
        import Foundation
        
        // define date - time interval for testing
        let start = Calendar.current.date(from: DateComponents(year: 2018, month: 1, day: 1))
        let end = Calendar.current.date(from: DateComponents(year: 2018, month: 1, day: 3))
        let s = start!.timeIntervalSinceReferenceDate
        let e = end!.timeIntervalSinceReferenceDate
        
        // generate array of random data with timestamp from defined date - time interval
        var data: [[String: Double]] = []
        (0..<10).forEach { _ in
            let ax = Double.random(in: -1.0...1.0)
            let ay = Double.random(in: -1.0...1.0)
            let az = Double.random(in: -1.0...1.0)
            // stamp between start and end date, with one second resolution
            let timestamp = TimeInterval.random(in: s...e).rounded()
            let record = ["ax": ax, "ay": ay, "az": az, "timestamp": timestamp]
            data.append(record)
        }
        

        print(data as NSArray) 得到了什么?

        (
                {
                ax = "-0.9915295335923959";
                ay = "0.04220588780831558";
                az = "0.04947324263041164";
                timestamp = 536480749;
            },
                {
                ax = "0.8339518841345668";
                ay = "-0.8796254984325194";
                az = "0.9274526027609205";
                timestamp = 536596358;
            },
                {
                ax = "0.1892933660394962";
                ay = "0.2786212981444189";
                az = "-0.7010853895168836";
                timestamp = 536453459;
            },
                {
                ax = "-0.3879536539762585";
                ay = "-0.9881198368284949";
                az = "-0.8103733151058379";
                timestamp = 536574669;
            },
                {
                ax = "0.4386373099712233";
                ay = "-0.1082200532953461";
                az = "-0.5452489312143274";
                timestamp = 536515655;
            },
                {
                ax = "0.1021774847462089";
                ay = "-0.6414676993950421";
                az = "0.8826716373674426";
                timestamp = 536455164;
            },
                {
                ax = "0.1877861732407253";
                ay = "-0.6069605631703257";
                az = "-0.3766270018644693";
                timestamp = 536569833;
            },
                {
                ax = "0.3011539934614316";
                ay = "-0.8534914632655413";
                az = "0.652288374381045";
                timestamp = 536477646;
            },
                {
                ax = "-0.3087207248856481";
                ay = "0.566261641115348";
                az = "-0.6320769324182691";
                timestamp = 536563296;
            },
                {
                ax = "-0.5450288945879682";
                ay = "0.6143645223909975";
                az = "-0.8973854689667276";
                timestamp = 536609836;
            }
        )
        

        现在我得到了与您收到的“相同格式”的数据(不是 JSON,而是 Swift 的字典数组),并且在下一个简单函数的帮助下

        // extract date and time from timestamp value
        func stamp(timestamp: TimeInterval)->(date: String, time: String) {
            let date = Date(timeIntervalSinceReferenceDate: timestamp)
            return (DateFormatter.localizedString(from: date, dateStyle: .short, timeStyle: .none),
            DateFormatter.localizedString(from: date, dateStyle: .none, timeStyle: .medium))
        }
        

        我们已准备好根据需要按日期和时间对您的数据值进行分组

        // group data by date and time, if duplicated timestamp, use last value only
        let result = data.reduce(into: [String:[String:[String: Double]]]()) { (result, record) in
            guard let ts = record["timestamp"] else { return }
            var record = record
            record["timestamp"] = nil
            let (date, time) = stamp(timestamp: ts)
            if result[date] == nil {
                result[date] = [time : record]
            } else {
                result[date]?[time] = record
            }
        }
        

        查看结果 [String:[String:[String: Double]]] 打印为 NSDictionary 的样子

        {
            "01/01/2018" =     {
                "00:50:59" =         {
                    ax = "0.1892933660394962";
                    ay = "0.2786212981444189";
                    az = "-0.7010853895168836";
                };
                "01:19:24" =         {
                    ax = "0.1021774847462089";
                    ay = "-0.6414676993950421";
                    az = "0.8826716373674426";
                };
                "07:34:06" =         {
                    ax = "0.3011539934614316";
                    ay = "-0.8534914632655413";
                    az = "0.652288374381045";
                };
                "08:25:49" =         {
                    ax = "-0.9915295335923959";
                    ay = "0.04220588780831558";
                    az = "0.04947324263041164";
                };
                "18:07:35" =         {
                    ax = "0.4386373099712233";
                    ay = "-0.1082200532953461";
                    az = "-0.5452489312143274";
                };
            };
            "02/01/2018" =     {
                "07:21:36" =         {
                    ax = "-0.3087207248856481";
                    ay = "0.566261641115348";
                    az = "-0.6320769324182691";
                };
                "09:10:33" =         {
                    ax = "0.1877861732407253";
                    ay = "-0.6069605631703257";
                    az = "-0.3766270018644693";
                };
                "10:31:09" =         {
                    ax = "-0.3879536539762585";
                    ay = "-0.9881198368284949";
                    az = "-0.8103733151058379";
                };
                "16:32:38" =         {
                    ax = "0.8339518841345668";
                    ay = "-0.8796254984325194";
                    az = "0.9274526027609205";
                };
                "20:17:16" =         {
                    ax = "-0.5450288945879682";
                    ay = "0.6143645223909975";
                    az = "-0.8973854689667276";
                };
            };
        }
        

        JSON 部分由您决定。

        【讨论】:

        • 现在我使用全局静态结构。但我也会试一试你的解决方案。不过还是谢谢。
        猜你喜欢
        • 2019-09-18
        • 1970-01-01
        • 2016-01-04
        • 1970-01-01
        • 1970-01-01
        • 2019-07-23
        • 1970-01-01
        • 2013-11-21
        • 1970-01-01
        相关资源
        最近更新 更多