您的位置:首页 > Web前端 > JavaScript

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

著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: