Home

Awesome

Gson 解析容错框架

集成步骤

allprojects {
    repositories {
        // JitPack 远程仓库:https://jitpack.io
        maven { url 'https://jitpack.io' }
    }
}
dependencyResolutionManagement {
    repositories {
        // JitPack 远程仓库:https://jitpack.io
        maven { url 'https://jitpack.io' }
    }
}
android {
    // 支持 JDK 1.8
    compileOptions {
        targetCompatibility JavaVersion.VERSION_1_8
        sourceCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    // Gson 解析容错:https://github.com/getActivity/GsonFactory
    implementation 'com.github.getActivity:GsonFactory:9.6'
    // Json 解析框架:https://github.com/google/gson
    implementation 'com.google.code.gson:gson:2.10.1'
    // Kotlin 反射库:用于反射 Kotlin data class 类对象,1.5.10 请修改成当前项目 Kotlin 的版本号
    implementation 'org.jetbrains.kotlin:kotlin-reflect:1.5.10'
}

使用文档

// 获取单例的 Gson 对象(已处理容错)
Gson gson = GsonFactory.getSingletonGson();

其他 API

// 设置自定义的 Gson 对象
GsonFactory.setSingletonGson(Gson gson);

// 创建一个 Gson 构建器(已处理容错)
GsonBuilder gsonBuilder = GsonFactory.newGsonBuilder();

// 注册类型适配器
GsonFactory.registerTypeAdapterFactory(TypeAdapterFactory factory);

// 注册构造函数创建器
GsonFactory.registerInstanceCreator(Type type, InstanceCreator<?> creator);

// 添加反射访问过滤器
GsonFactory.addReflectionAccessFilter(ReflectionAccessFilter filter);

// 设置 Json 解析容错回调对象
GsonFactory.setParseExceptionCallback(ParseExceptionCallback callback);

框架混淆规则

-keep class com.hjq.gson.factory.** {*;}

不同 Json 解析框架之间的对比

功能或细节GsonFactoryGsonmoshiFastJson
对应版本9.61.30.61.5.02.0.28
issues 数
框架体积60 KB + 283 KB283 KB162 KB188 KB
框架维护状态维护中维护中维护中停止维护
解析错误类型数据时是否能不报错
解析到错误类型数据时是否能往下解析其他字段
解析错误类型数据时是否能对数据进行智能转换
适配 kotlin data class 字段上的默认值
适配 kotlin data class 非空无默认值字段
是否有跳过解析 Json 中的 null 值(避免空指针)
是否支持解析 org.json.JSONObject 类型
是否支持解析 org.json.JSONArray 类型

数据类型容错介绍

数据类型容错的范围数据示例
bean集合、字符串、布尔值、数值[]""false0
集合bean、字符串、布尔值、数值{}""false0
字符串bean、集合、布尔值、数值{}[]false0
布尔值bean、集合、字符串、数值{}[]""0
数值bean、集合、字符串、布尔值{}[]""false

适配 kotlin 空值介绍

class XxxBean {
    
    val age: Int = 18
}

适配 kotlin data class 默认值介绍

data class DataClassBean(val name: String = "Hello")
name = null

适配 kotlin data class 非空无默认值字段介绍

data class DataClassBean(var name: String)

常见疑问解答

Retrofit 怎么替换 Gson?

Retrofit retrofit = new Retrofit.Builder()
        .addConverterFactory(GsonConverterFactory.create(GsonFactory.getSingletonGson()))
        .build();

如何替换项目中已有的原生 Gson ?

// 替换调用
new Gson()
GsonFactory.getSingletonGson()
// 替换导包
import com.google.gson.Gson
import com.hjq.gson.factory.GsonFactory
// 再手动处理一些没有替换成功的
new GsonBuilder()

有没有必要处理 Json 解析容错?

我们后台用的是 Java,有必要处理容错吗?

使用了这个框架后,我如何知道出现了 Json 错误,从而保证问题不被掩盖?

// 设置 Json 解析容错监听
GsonFactory.setParseExceptionCallback(new ParseExceptionCallback() {

    @Override
    public void onParseObjectException(TypeToken<?> typeToken, String fieldName, JsonToken jsonToken) {
        handlerGsonParseException("解析对象析异常:" + typeToken + "#" + fieldName + ",后台返回的类型为:" + jsonToken);
    }

    @Override
    public void onParseListItemException(TypeToken<?> typeToken, String fieldName, JsonToken listItemJsonToken) {
        handlerGsonParseException("解析 List 异常:" + typeToken + "#" + fieldName + ",后台返回的条目类型为:" + listItemJsonToken);
    }

    @Override
    public void onParseMapItemException(TypeToken<?> typeToken, String fieldName, String mapItemKey, JsonToken mapItemJsonToken) {
        handlerGsonParseException("解析 Map 异常:" + typeToken + "#" + fieldName + ",mapItemKey = " + mapItemKey + ",后台返回的条目类型为:" + mapItemJsonToken);
    }

    private void handlerGsonParseException(String message) {
        if (BuildConfig.DEBUG) {
            throw new IllegalArgumentException(message);
        } else {
            // 上报到 Bugly 错误列表中
            CrashReport.postCatchedException(new IllegalArgumentException(message));
        }
    }
});

作者的其他开源项目

微信公众号:Android轮子哥

Android 技术 Q 群:10047167

如果您觉得我的开源库帮你节省了大量的开发时间,请扫描下方的二维码随意打赏,要是能打赏个 10.24 :monkey_face:就太:thumbsup:了。您的支持将鼓励我继续创作:octocat:(点击查看捐赠列表

License

Copyright 2020 Huang JinQun

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.