当前位置: 首页 > 面试题库 >

将JSON(日期)解析为Swift

毕浩渺
2023-03-14
问题内容

我在Swift的应用程序中有一个返回JSON,并且有一个返回日期的字段。当我引用此数据时,代码会给我类似“ /
Date(1420420409680)/”的信息。如何将其转换为NSDate?请在Swift中用Objective-C测试示例,但没有成功。


问题答案:

这看起来与Microsoft的ASP.NET
AJAX使用的日期的JSON编码非常相似,JavaScript和.NET中的JavaScript对象符号表示法(JSON)介绍了该日期:

例如,Microsoft的ASP.NET AJAX均不使用所描述的约定。而是将.NET DateTime值编码为JSON字符串,其中字符串的内容为/
Date(ticks)/,而ticks代表自历元(UTC)以来的毫秒数。因此,1989年11月29日上午4:55:30,以UTC编码为“ \ /
Date(628318530718)\ /”。

唯一的区别是您具有格式,/Date(ticks)/ 而没有\/Date(ticks)\/

您必须提取括号之间的数字。将其除以1000得到自1970年1月1日以来的秒数。

以下代码显示了如何完成此操作。它被实现为“失败的便利初始化程序”,用于NSDate

extension NSDate {
    convenience init?(jsonDate: String) {

        let prefix = "/Date("
        let suffix = ")/"
        // Check for correct format:
        if jsonDate.hasPrefix(prefix) && jsonDate.hasSuffix(suffix) {
            // Extract the number as a string:
            let from = jsonDate.startIndex.advancedBy(prefix.characters.count)
            let to = jsonDate.endIndex.advancedBy(-suffix.characters.count)
            // Convert milliseconds to double
            guard let milliSeconds = Double(jsonDate[from ..< to]) else {
                return nil
            }
            // Create NSDate with this UNIX timestamp
            self.init(timeIntervalSince1970: milliSeconds/1000.0)
        } else {
            return nil
        }
    }
}

用法示例(带有日期字符串):

if let theDate = NSDate(jsonDate: "/Date(1420420409680)/") {
    print(theDate)
} else {
    print("wrong format")
}

这给出了输出

2015-01-05 01:13:29 +0000

Swift 3(Xcode 8)更新:

extension Date {
    init?(jsonDate: String) {

        let prefix = "/Date("
        let suffix = ")/"

        // Check for correct format:
        guard jsonDate.hasPrefix(prefix) && jsonDate.hasSuffix(suffix) else { return nil }

        // Extract the number as a string:
        let from = jsonDate.index(jsonDate.startIndex, offsetBy: prefix.characters.count)
        let to = jsonDate.index(jsonDate.endIndex, offsetBy: -suffix.characters.count)

        // Convert milliseconds to double
        guard let milliSeconds = Double(jsonDate[from ..< to]) else { return nil }

        // Create NSDate with this UNIX timestamp
        self.init(timeIntervalSince1970: milliSeconds/1000.0)
    }
}

例:

if let theDate = Date(jsonDate: "/Date(1420420409680)/") {
    print(theDate)
} else {
    print("wrong format")
}


 类似资料:
  • 在使用date格式自动设置为IE后,我试图解析某个包含日期条目为纪元数值的json文档。我需要不同的格式(也需要一毫秒) 所以问题是,如何解析IE。转换为带有Bson文档的某种自定义格式字符串。解析方法? 编辑:只是一个更新:问题在document.parse方法中,因为我不知道如何在解析json文档时使用tell.parse函数来使用自定义的日期格式。我总是得到某种默认的日期格式。如何发送给.p

  • 我试图以以下格式解析来自MySql的数据: Java解析器代码如下: java线程“AWT-EventQueue-0”中出现异常。时间总体安排DateTimeParseException:无法解析文本“06-08-2017 04:15”:无法从临时助理获取ZonedDateTime:{MinuteOfHour=15,DayOfMonth=8,WeekBasedYear[WeekFields[SUN

  • 问题内容: 原谅我是我不熟悉ObjectiveC。 我从/ Date(xxxxxxxxxxxxx-xxxx)/格式的.NET Web服务获取日期。我正在寻找有关如何最好地将其解析为NSDate对象的方向。我曾尝试在其上使用dateWithTimeIntervalSince1970,但它返回的日期是1969年,而我知道该日期是2006年。 寻找正确的方法来处理JSON日期的方向。 提前致谢! 问题答

  • 问题内容: 我的json 响应 包含一个 CreatedOn 日期: 我需要将 CreatedOn 转换为简单的日期格式,并 计算从CreatedOn日期到当前日期的差异天数。 当我调试下面的代码字符串 CreatedOn时 显示一个空值。怎么会? 问题答案: 要么 考虑使用JSON方法而不是包含。JSON具有“ has()”,用于验证密钥是否存在。 您还应该确保首先尝试{}捕获{}字符串,以确保

  • 问题内容: 我在MongoDB中的规范化数据模型结构中遇到以下错误: 这是由于以下原因造成的: 具体的部分。我的文档中有一个DBRef对象,因此我可以引用另一个集合中的文档。嵌入式文档结构不是选项。那么我该如何解决呢? 问题答案: 您必须为其导入DBRef编解码器才能进行打印,如果您希望以文档json样式进行打印,则需要编写自己的DBRef编解码器,并将其添加到您给toJson()的编解码器中。

  • 问题内容: 我有一个XML文件,例如 如何将其解析为JSON结构文件? 问题答案: 对于一个简单的解决方案,我建议使用Jackson库,它是一个Java库,用于生成和读取带有XML扩展名的JSON,因为它只需几行简单的代码就可以将任意复杂的XML转换为JSON。 input.xml Java代码: 该演示使用Jackson 1.7.7 (较新的1.7.8也可以使用),Jackson XML Dat