V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
HannibaI
V2EX  ›  iDev

初学 iOS,关于 JSONSerialization 行为的问题?

  •  
  •   HannibaI ·
    ingjieye · 2016-11-23 09:15:45 +08:00 · 3374 次点击
    这是一个创建于 2704 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需要解析的 json 是这个: www.zimuzu.tv/resource/index_json/rid/33701/channel/tv (去掉首行的"var index_info=")

    可以在 http://tool.oschina.net/codeformat/json 进行可视化

    相关代码是这样

    let json = try? JSONSerialization.jsonObject(with: data, options: [])
    if let dictionary = json as? [String: Any] {
        if let array = dictionary["prevue"] as? NSArray {
        	print(array[0])
        }
    }
    

    问题是:

    • 我如何确定 JSONSerialization.jsonObject(with:options:) -> Any 返回的具体类型?
    • 为什么 dictionary["prevue"]无法转换成[String: Any]? 我如何确定 dictionary["prevue"]的具体类型?
    • 在把 dictionary["prevue"]转换成 NSArray 后, print("array[0]")的输出, key 值两边的双引号为什么不见了?
    {
        episode = 9;
        "play_time" = "2016-11-28";
        season = 1;
        t = 1480348800;
        week = "\U5468\U4e00";
    }
    

    附:官方博客对 JSONSerialization 的示范代码 : developer.apple.com/swift/blog/?id=37

    第 1 条附言  ·  2016-11-25 08:53:03 +08:00

    谢谢各位 问题解决了

    13 条回复    2016-11-25 06:51:46 +08:00
    expkzb
        1
    expkzb  
       2016-11-23 09:29:50 +08:00   ❤️ 1
    你打印出来的是对象的 "description" ,不是 json 原始字符串,所以看不到引号
    miketeam
        2
    miketeam  
       2016-11-23 09:46:24 +08:00 via iPhone   ❤️ 1
    print 打印做处理了。你可以显示在 view 上看效果。
    miketeam
        3
    miketeam  
       2016-11-23 09:50:24 +08:00 via iPhone   ❤️ 1
    返回类型可以判断,或者断言,不建议强转。第二个问题同第 3 个问题,也有可能出来的是数组,怎么变字典呢?
    HannibaI
        4
    HannibaI  
    OP
       2016-11-23 09:54:50 +08:00
    @expkzb
    @miketeam
    谢谢!解决了!
    不过很奇怪为什么第一层的 Any 只能转换成 NSArray 不能转换成[String: Any]

    paradoxs
        5
    paradoxs  
       2016-11-23 09:57:20 +08:00   ❤️ 1
    一般不会用这个的, 用 YYModel
    HannibaI
        6
    HannibaI  
    OP
       2016-11-23 10:00:51 +08:00
    @miketeam 官方博客上对返回类型的处理是转换成字典,然后对于第二层的处理也是转换成字典,我查了文档也只是说返回的会是基本类型的某一种。我看了一下我的数据格式和官方博客上的差不多,所以就奇怪为什么我的第二层不能转换成字典而是转换成数组
    HannibaI
        7
    HannibaI  
    OP
       2016-11-23 10:04:11 +08:00
    @paradoxs 谢谢!看了一下好像没有 Swift 版...
    loveuqian
        8
    loveuqian  
       2016-11-23 10:06:17 +08:00   ❤️ 1
    从来没用过这个东西

    swift 用 SwityJSON
    HannibaI
        9
    HannibaI  
    OP
       2016-11-23 10:23:20 +08:00
    @loveuqian 谢谢!我试试
    miketeam
        10
    miketeam  
       2016-11-23 10:50:08 +08:00
    @loveuqian 你这么说我就不认同了啊。虽说第三方好用,但是苹果自带的东西也是蛮强大的。有时候几行代码可以搞定,弄个第三方库感觉很累。。
    InfinitySam
        11
    InfinitySam  
       2016-11-23 20:36:13 +08:00   ❤️ 1
    @HannibaI 看具体的 json 结构啊,你可以用 writeToFile funciton 将它保存为 plist 文件,这样就很清晰了
    kitalphaj
        12
    kitalphaj  
       2016-11-24 09:35:35 +08:00   ❤️ 1
    @HannibaI 第一层你可以看看 prevue 对应的 值 很显然是个数组。你如果想一步到位可以用 as? [[String: Any]]
    HannibaI
        13
    HannibaI  
    OP
       2016-11-25 06:51:46 +08:00
    @kitalphaj 确实是这样的 谢谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   903 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:10 · PVG 05:10 · LAX 14:10 · JFK 17:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.