引言(想直接看方法的可跳到后面)
在开发过程当中,几乎避免不了的就是与各种数据打交道,数据的结构载体Json由于轻量简便,大家都在广泛使用。
例如我们要解析如下的Json数据:
{
"respCode": "0",
"respMsg": "获取成功",
"data":
{
"id": "999999",
"name": "张三",
"age": 23
}
}
Android版本
这里简要说下Android开发过程中我非常喜欢的一种实现json解析的方式(以Gson库解析为例)
- Json数据转化为Class结构
- 网络获取相应数据
- 使用Gson解析为Class实例
我们先把以上数据转化为java文件
public class Model {
String respCode;
String respMsg;
Data data;
class Data {
String id;
String name;
int age;
}
}
之后使用Gson库解析以上Json字符串
Gson gson = new Gson();
Model model= gson.formJson("以上举例的Json字符串",Model.class);
之后就可以使用model这个实例做任何事了
当然,手写class结构那就out了,这里推荐大家两个工具生成相应的类
一个是 jsonschema2pojo
一个是AndroidStudio中的插件GsonFormat
当然使用的方法自行百度
IOS版本
Android开发我习惯这么做,最近在接触IOS开发,有太多相同的地方,依样画葫芦的实现
1.Json数据转化为swift3中的struct或class
//struct是值类型,class是引用类型,如值不怎么需要改变的话用struct效率会高点
//这里就用struct举例,当然struct关键字换成class就一样了
struct Model{
var data: Data?
var respCode: String?
var respMsg: String?
}
struct Data{
var id: String?
var name: String?
var age:Int?
}
然后就可以使用Swift3自带的Json解析语法,当然那样比较麻烦这里就不细说了,
手写struct也是效率非常慢的,这里就推荐大家使用一个工具
https://github.com/zadr/j2s(免费)
下载下来导入到xcode安装就可以使用
这里就不多做介绍,而且有了源码之后就可以自定义自己的结构了
2.Json数据转化为struct(或class)实例
这里向大家推荐一个
阿里巴巴开源库https://github.com/alibaba/HandyJSON
当然具体用发我这里就不细说了
之后struct就变成这样
struct Model: HandyJSON {
var data: Date?
var respCode: String?
var respMsg: String?
}
struct Date: HandyJSON {
var id: String?
var name: String?
var age:Int?
}
-----------分割线
//拿到了实例就能想干啥就干啥了
let model = BaseType.deserialize(from: "最上面举例的Json字符串")
当然还有更高效的做法,我们每个结构体都要实现: HandyJSON
协议也非常麻烦,我们可以使用到之前提到的j2s工具了,源代码下载下来后改造如成如下所示
public var description: String {
let typeName = name.generatedClassName()
var d = ""
properties.flatMap { (json) -> String? in
if case .date(_, let format) = json.underlying { return format }
return nil
} .forEach {
d += "\nprivate let \(typeName)DateFormatter\(abs($0.hashValue)): DateFormatter = {"
d += "\n\tvar dateFormatter = DateFormatter()"
d += "\n\tdateFormatter.dateFormat = \"\($0)\""
d += "\n\treturn dateFormatter"
d += "\n}()\n\n"
}
d += "struct \(typeName): HandyJSON {"
d += "\(propertyDeclarationCode)\n"
d += "\n"
d += "}\n"
return d
}
不想要相应的扩展也可以研究下代码把生成步骤注释掉即可,编译项目
最后如图所示
怎么样,是不是很方便呢