以前跟着《第一行代码》入门 Android 的时候,学过几个解析 JSON 的方法,一个一个按 key 名找、建对象存等等,解析的工具也很多,以前对 JSON 不熟悉,这也浪费了我很多时间。现在刚入门 iOS 没多久就让我看到神器 JSONExport,解析 JSON 从此只是几行代码的事情~

JSONExport 是一个运行在 macOS 上通过 JSON 字符串转为 model 的开源工具,支持 Java、Objective-C 和 Swift。我发现了这工具之后忍不住用 Charles 到处抓 API 测试,这是后话~

每次学完了都觉得很基础…还是记下来吧…

工具

JSONExport 的项目地址在这:JSONExport
不过项目需要自己编译,嫌麻烦的可以直接下载我汉化好的 JSONExport ,如果失效请在评论留言,下面是界面:

左边把 JSON 字符串放入,右下角选择要生成的 Model 即可。

使用

这里我使用豆瓣图书 Api V2的 API 做示范。

根据提供的 API ,假如我想获得十个书名为"ios 开发"的书籍名,可以构建 URL 为"https://api.douban.com/v2/book/search?count=10&q=ios%20%E5%BC%80%E5%8F%91",在网页中打开获得 JSON 字符串。

遇到的坑:

  • JSON 字符串中含有中文可能会被说明“无效 JSON”,转成unicode再放到工具里去用吧,例如:在线unicode转中文,或者用下图的 Paw。
  • Mac App Store 中也有同名工具,应该是别人直接修改原作者后上传的,能够根据 JSON 地址提取 JSON 数据,不过也是一搜中文就闪退。
  • JSONExport 没生成正确的 Model 就重启吧。

复制至JSONExport中,右下角按需选择,这里我用 Swift - Struct 做示范。

之后点右下角保存,把这六个文件拷到项目中就能直接使用了!我们可以直接构建一个 Struct。

BookInfo.swift

1
2
3
4
5
6
7
struct BookInfo {
var images = ""
var title = ""
var isbn13 = ""
var url = ""
var summary = ""
}

这里我只需要图片、标题、isbn13、url和简介,接下来在 ViewController 中新建个方法获取数据,这里用了用 Swift 写的第三方网络库 Just。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
let searchUrl = "https://api.douban.com/v2/book/search?count=10&q=ios%20%E5%BC%80%E5%8F%91"//搜索"ios 开发"
var booklist : [BookInfo] = []

override func viewDidLoad() {
super.viewDidLoad()
loadList()
}

func loadList() {
Just.get(searchUrl) { (r) in
guard let json = r.json as? NSDictionary else {
print("没有数据啊!!!")
return
}

let books = SearchBook(fromDictionary: json).books!

self.booklist = books.map({ (book) -> BookInfo in
//数组转换数组 直接在 map 中用闭包
return BookInfo(images: book.images.large, title: book.title, isbn13: book.isbn13, url: book.url, summary: book.summary)
})

dump(self.booklist)

OperationQueue.main.addOperation {
self.tableView.reloadData()
self.refreshControl?.endRefreshing()
}
}
}

如果 Xcode 自动提示没有提供初始化语句,可以在刚刚的 BookInfo.swift 中自动补全代码,再剪切过来用。

运行后可以看到 dump 的数据已经出来了:

其实本文到这就差不多了,主要注意 JSON 中数组和这里生成 Model 的关系。最后附上一个小 Demo ,还没加搜索框,没用完解析的数据,将就看吧…_(:ェ」∠)_

项目可以参照这里 Donban-demo-with-JSONExport