LoganSquare的简单使用——快到爆炸地解析和序列化JSON
2016-04-12 09:44
609 查看
http://www.jianshu.com/p/9c3173b2e70b
下载安装
还在使用Eclipse的同学,很遗憾,无法使用LoganSquare 。Gradle 是 LoganSquare 唯一支持的配置方法。
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
}
}
apply plugin: 'com.neenbedankt.android-apt'
dependencies {
apt 'com.bluelinelabs:logansquare-compiler:1.1.0'
compile 'com.bluelinelabs:logansquare:1.1.0'
}
除了加入了LoganSquare依赖(只有19kb,真心小)还有apt插件,apt插件是用于运行时的注解处理的。
使用
Step1 对要转换的实体类注解
提供了3种类型的注解方案,主要是默认的接受转换的类属性范围有些微不同。空值的属性默认忽略。
1.全属性注解方案
/*
*所有属性接受解析和序列化。
* 作者推荐的方案,更少错误,但要打更多的注解。
*/
@JsonObject
public class Image {
/*
* 标准的属性注解
*/
@JsonField
public String format;
/*
* 解析和序列化时,该属性的key用"_id"代替"imageId"
*/
@JsonField(name = "_id")
public int imageId;
@JsonField
public String url;
@JsonField
public String description;
/*
* 注意虽然该属性只有包访问权限,但LoganSquare可毫无障碍地处理
*/
@JsonField(name = "similar_images")
List<Image> similarImages;
/*
* 不注解的属性默认被LoganSquare忽略
*/
public int nonJsonField;
/*
* !!!强烈注意private权限的属性必须提供getter和setter, 不然你会后悔的
*/
@JsonField
private int privateInt;
public int getPrivateInt() {
return privateInt;
}
public void setPrivateInt(int i) {
privateInt = i;
}
/*
* 还贴心地提供了解析完成后和序列化前的回调接口,当然是可选的
*/
@OnJsonParseComplete void onParseComplete() {
// 解析完成后干点什么
}
@OnPreJsonSerialize void onPreSerialize() {
//序列化前干点什么
}
}
2.非private属性注解方案
/*非private属性都会接受解析和序列化,即使属性没有写@JsonFields注解,但要先配置 fieldDetectionPolicy
* 这个方案比第一个方案写少点注解
*/
@JsonObject(fieldDetectionPolicy = FieldDetectionPolicy.NONPRIVATE_FIELDS)
public class Image {
/*
*普通声明的属性默认会被解析和序列化
*/
public String format;
/*
*重命名key还是需要注解来指出的
*/
@JsonField(name = "_id")
public int imageId;
public String url;
public String description;
/*
* 包访问权限的处理是没问题的
*/
List<Image> similarImages;
/*
* 用@JsonIgnore来忽略不想被解析和序列化的属性
*/
@JsonIgnore
public int nonJsonField;
/*
* 该策略下private属性默认忽略
*/
private int privateInt;
public int getPrivateInt() {
return privateInt;
}
public void setPrivateInt(int i) {
privateInt = i;
}
@OnJsonParseComplete void onParseComplete() {
// 解析完成后干点什么
}
@OnPreJsonSerialize void onPreSerialize() {
//序列化前干点什么
}
}
3.非private+Accessor注解方案
/*
* 与第2种类似,非private属性和所有有getter和setter的属性都会被解析和序列化。可以让某些private属性
* 也接受转换;
* 将 fieldDetectionPolicy 设置为FieldDetectionPolicy.NONPRIVATE_FIELDS_AND_ACCESSORS即可
*/
Step2 解析&序列化
将JSON对象解析为实体类
// 支持直接从InputStream解析
InputStream is = ...;
Image imageFromInputStream = LoganSquare.parse(is, Image.class);
// 从Json字符串解析
String jsonString = ...;
Image imageFromString = LoganSquare.parse(jsonString, Image.class);
实体类序列化为JSON对象
// Serialize it to an OutputStream
OutputStream os = ...;
LoganSquare.serialize(image, os);
// Serialize it to a String
String jsonString = LoganSquare.serialize(image);
混淆
-keep class com.bluelinelabs.logansquare.** { *; }
-keep @com.bluelinelabs.logansquare.annotation.JsonObject class *
-keep class **$$JsonObjectMapper { *; }
文/炊事班程序猿小谢(简书作者)
原文链接:http://www.jianshu.com/p/9c3173b2e70b
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
http://www.jianshu.com/p/9c3173b2e70b
下载安装
还在使用Eclipse的同学,很遗憾,无法使用LoganSquare 。Gradle 是 LoganSquare 唯一支持的配置方法。
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
}
}
apply plugin: 'com.neenbedankt.android-apt'
dependencies {
apt 'com.bluelinelabs:logansquare-compiler:1.1.0'
compile 'com.bluelinelabs:logansquare:1.1.0'
}
除了加入了LoganSquare依赖(只有19kb,真心小)还有apt插件,apt插件是用于运行时的注解处理的。
使用
Step1 对要转换的实体类注解
提供了3种类型的注解方案,主要是默认的接受转换的类属性范围有些微不同。空值的属性默认忽略。
1.全属性注解方案
/*
*所有属性接受解析和序列化。
* 作者推荐的方案,更少错误,但要打更多的注解。
*/
@JsonObject
public class Image {
/*
* 标准的属性注解
*/
@JsonField
public String format;
/*
* 解析和序列化时,该属性的key用"_id"代替"imageId"
*/
@JsonField(name = "_id")
public int imageId;
@JsonField
public String url;
@JsonField
public String description;
/*
* 注意虽然该属性只有包访问权限,但LoganSquare可毫无障碍地处理
*/
@JsonField(name = "similar_images")
List<Image> similarImages;
/*
* 不注解的属性默认被LoganSquare忽略
*/
public int nonJsonField;
/*
* !!!强烈注意private权限的属性必须提供getter和setter, 不然你会后悔的
*/
@JsonField
private int privateInt;
public int getPrivateInt() {
return privateInt;
}
public void setPrivateInt(int i) {
privateInt = i;
}
/*
* 还贴心地提供了解析完成后和序列化前的回调接口,当然是可选的
*/
@OnJsonParseComplete void onParseComplete() {
// 解析完成后干点什么
}
@OnPreJsonSerialize void onPreSerialize() {
//序列化前干点什么
}
}
2.非private属性注解方案
/*非private属性都会接受解析和序列化,即使属性没有写@JsonFields注解,但要先配置 fieldDetectionPolicy
* 这个方案比第一个方案写少点注解
*/
@JsonObject(fieldDetectionPolicy = FieldDetectionPolicy.NONPRIVATE_FIELDS)
public class Image {
/*
*普通声明的属性默认会被解析和序列化
*/
public String format;
/*
*重命名key还是需要注解来指出的
*/
@JsonField(name = "_id")
public int imageId;
public String url;
public String description;
/*
* 包访问权限的处理是没问题的
*/
List<Image> similarImages;
/*
* 用@JsonIgnore来忽略不想被解析和序列化的属性
*/
@JsonIgnore
public int nonJsonField;
/*
* 该策略下private属性默认忽略
*/
private int privateInt;
public int getPrivateInt() {
return privateInt;
}
public void setPrivateInt(int i) {
privateInt = i;
}
@OnJsonParseComplete void onParseComplete() {
// 解析完成后干点什么
}
@OnPreJsonSerialize void onPreSerialize() {
//序列化前干点什么
}
}
3.非private+Accessor注解方案
/*
* 与第2种类似,非private属性和所有有getter和setter的属性都会被解析和序列化。可以让某些private属性
* 也接受转换;
* 将 fieldDetectionPolicy 设置为FieldDetectionPolicy.NONPRIVATE_FIELDS_AND_ACCESSORS即可
*/
Step2 解析&序列化
将JSON对象解析为实体类
// 支持直接从InputStream解析
InputStream is = ...;
Image imageFromInputStream = LoganSquare.parse(is, Image.class);
// 从Json字符串解析
String jsonString = ...;
Image imageFromString = LoganSquare.parse(jsonString, Image.class);
实体类序列化为JSON对象
// Serialize it to an OutputStream
OutputStream os = ...;
LoganSquare.serialize(image, os);
// Serialize it to a String
String jsonString = LoganSquare.serialize(image);
混淆
-keep class com.bluelinelabs.logansquare.** { *; }
-keep @com.bluelinelabs.logansquare.annotation.JsonObject class *
-keep class **$$JsonObjectMapper { *; }
文/炊事班程序猿小谢(简书作者)
原文链接:http://www.jianshu.com/p/9c3173b2e70b
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
相关文章推荐
- js 数值 精确运算
- js颜色选择器 制作分析
- JSP和HTML和JS - 双引号嵌套问题解决方案(不断完善中)
- FullPage.js 活动单页 - 全屏滚动插件
- 接收json格式错误,开头出现多余问号
- json字符串转成 Map/List
- javascript for in 循环
- 文本框失去焦点后js判断输入是否为数字
- JS 去除数组中重复的元素
- JS 判断某个字符串是否存在与数组中
- BZOJ 1032 JSOI 2007 祖码Zuma 区间DP
- 上传图片js判断
- 关于js封装框架类库之选择器引擎(二)
- javascript中数组方法(未完待续)
- js小知识点
- javascript 中获取对象的长度(map对象的长度)--js关联数组的长度
- Backbone.js简单入门范例
- js如何往数组Array中添加元素 (2013-09-04 10
- JavaScript闭包理解【关键字:普通函数、变量访问作用域、闭包、解决获取元素标签索引】
- 对avalonjs的研究