LoganSquare的简单使用——快到爆炸地解析和序列化JSON

来源:互联网 发布:wincc 用c语言? 编辑:程序博客网 时间:2024/06/05 16:21


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
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。


0 0