getActivity / GsonFactory

Gson 解析容错框架,愿从此再无 Json 解析报错
Apache License 2.0
667 stars 66 forks source link

[建议]:兼容类型不匹配的情况 #31

Closed zzl313703419 closed 9 months ago

zzl313703419 commented 11 months ago

你觉得框架有什么不足之处?【必答】

建议容错库遇到类型匹配但解析错误的时候,也可以返回默认值 例子复现如下:

public class JsonBean {
    private ArrayList<Double> dataValList = new ArrayList<>();
}
String json = "{\n" +
                    "        \"id\": \"1704391195266473986\",\n" +
                    "        \"dataValList\":\n" +
                    "        [\n" +
                    "            \"null\"\n" +
                    "        ],\n" +
                    "    }";
JsonBean bean = GsonFactory.getSingletonGson().fromJson(json, JsonBean.class);

执行以上代码 会直接抛出错误. 在真实场景中请求一个接口返回一段json解析,如果因为解析其中一个字段就整体抛错的话,也会让程序停止进行不下去,这一点是否可以优化

issue 是否有人曾提过类似的建议?【必答】

框架文档是否提及了该问题【必答】

是否已经查阅框架文档但还未能解决的【必答】

你觉得该怎么去完善会比较好?【非必答】

No response

getActivity commented 11 months ago
image

小伙子,你管这叫类型匹配错误?确定不是 Json 格式规范有问题?

zzl313703419 commented 11 months ago

不好意思,多了个标点符号,但不影响结果抛出异常的,可以再试下

try {
    String json = "{\"id\":\"1704391195266473986\",\"dataValList\":[\"null\"]}";
    JsonBean bean = new Gson().fromJson(json, JsonBean.class);
    System.out.println(1);
} catch (Exception e) {
    System.out.println(2);
}
13F9D95B-D6D9-4BF3-8330-0C6D9E2A909C
getActivity commented 11 months ago

你代码上面写的是 new Gson().fromJson,你确定这和我的框架有关系?

zzl313703419 commented 11 months ago

尴尬,我来回测试数据 为了写个demo忘记改回来了

058C1A4D-AF71-4A0B-8B06-5161F80C85E0
getActivity commented 11 months ago
image
getActivity commented 11 months ago

小伙子,我现在跑出来的结果跟你的不一样,你确定用是框架的最新版本?

zzl313703419 commented 11 months ago

是最新版本,你的ArrayList里的类型设错了.是Dobule不是String

63F5176B-DFE0-4DE4-85BE-DB5F1D87B581
getActivity commented 11 months ago

小伙子,经过实践验证,你说的这个问题确实存在,是因为框架在解析 Json 数组的时候,没有对异常做捕获,间接导致 jsonReader.endArray 方法还没有被调用,然后调用了 jsonReader.endObject 标记,所以才引发了这个问题。

getActivity commented 11 months ago

GsonFactory-8.2.aar.zip

getActivity commented 11 months ago

小伙子,目前针对这个问题已经进行了修复,并且自测通过了,你可以下载上面的 aar 包进行测试,有问题欢迎随时和我反馈。

zzl313703419 commented 11 months ago

好的 我去测一下 有劳轮子哥了

getActivity commented 11 months ago

@zzl313703419 小伙子,有发现啥问题不?

zzl313703419 commented 11 months ago

正在写一篇全方位测试 需要点时间

getActivity commented 11 months ago

@zzl313703419 小伙子,测试有结论了没?

zzl313703419 commented 11 months ago

估计明天左右有结果, 我得考虑细致周全一点

zzl313703419 commented 11 months ago

经测试GsonFactory-8.2.aar.zip解决了抛异常问题, 其实这一类相似的问题有很多,而且深入的细节也很多,所以我决定写一篇全面的分析报告, 以便分析交流。我将从以下几个方面入手。


一、为什么要容错

在调用接口时,服务器会返回很多有问题的数据,比如返回的字段值为null,返回的字段类型不匹配 ( 文档约定的是对象,返回了数组 ) 等等一系列问题。其实不管在哪家公司都必然会出现这样的问题,开发阶段出现问题及时让服务器去改是最常见的做法,等上了生产后出问题甚至可以甩锅给后端 ( 是服务器json数据出问题才导致的 ,这个锅得服务器背)。对这些我们深入展开一下。

  1. 开发中最头疼的必然是null空指针问题了,在字段使用时,各种的null判空使得代码臃肿不堪,关键是总有遗漏或者当时没问题事后null出问题的情况发生,相信这个问题肯定让很多人深恶痛绝。
  2. 在开发阶段接口返回json数据有问题,导致开发进度中断 ( 这里不考虑可以去做别的模块功能开发 ),那就必须得让服务器修改完bug以后才能继续工作,这期间的等待其实是效率很低的一件事,同时也会影响你的工作进度,如果这时候后端还有别的优先级别更高的事情要做,情况就更糟糕了。但如果这时候对json有容错处理的话,不管服务器返回任何数据,我去解析后都会有一个正常的结果或者说会有一个默认值,程序起码不报错,这时候开发也不会有影响,起码保证你的进度是可以正常进行的。
  3. 当上生产以后接口解析json报错,的确可以甩锅给后端,但我从另一个方面说,就是解析报错后你的界面怎么展示 ,是展示一个数据加载错误请重试的报错页面,还是弹出一个toast错误提示,亦或是界面正常展示只不过没有提示 ( 虽然是正常展示,但界面上本应该填充的数据项现在都为空了,而这仅仅可能是因为某个字段的解析错误导致的整体界面就不赋值了 ) 。App做了全局捕获导致不会闪退,但这种错误展示其实挺糟糕的,如果有方法能让结果变的更好的话,我相信大家都会去考虑的。所以这时候如果有json容错处理的话,就会展示正常的结果界面,只是解析错误的某个数据填充项值为默认值而已。
  4. 对json做容错后根本你不用考虑服务器返回了什么,团队间会减少很多内耗,更多的精力可以放在业务开发上。

二、关于容错的思考

  1. 说一下我心目中比较好的开发方案。用kotlin的data class创建bean对象,搭配Kotlin data classes from Json可以快速生成带有默认值的对象,使用json容错库对所有null以及解析错误的情况都转换成bean对象的默认值,这里只是举了个最简单的例子。

    data class Person(
       val name: String = "",
       val age: Int = 0,
       val shoe: ArrayList<String> = arrayListOf(),
    )

    这是一个Person对象,当shoe字段在json中的值为null , 或者为对象、其他非数组类型时,解析后应该都是shoe = [ ],是一个空数组对象,这样我就能直接拿来使用 不用考虑null问题和解析错误问题。容错方案看似简单,但深入研究发现里面里面细节很多。下面以demo为例展开。

三、对GsonFactory测试(基于8.0版本)

1) json解析通常情况装成Bean对象、数组集合、Map集合 (JsonArray、JsonObject原理应该一样,没放入demo测试)
2) Demo中TestBean对象的数组集合、Map集合其实可以不写例子,,但测试时我发现json转bean里集合和json单独转集合报错信息是不同的,因此还是列了出来。
3) 结合实际应用中各种场景罗列了各种情况,修改多次,包括打印信息排版之类,为了放起来更清晰直观一点,例子出的有点慢主要是思路一理再理,再给出一版。应该还有其他情况没考虑到,等优化一版后我再想想看。辛苦了~

Test.kt.zip

package com.example.myapplication

import com.google.gson.reflect.TypeToken
import com.hjq.gson.factory.GsonFactory
import java.math.BigDecimal

/**
 * Bean 类
 */
data class TestBean(
    //基础类型
    val base_1: String = "",
    val base_2: Boolean = false,
    val base_3: Int = 0,
    val base_4: Long = 0L,
    val base_5: Float = 0.0f,
    val base_6: Double = 0.0,
    val base_7: BigDecimal = BigDecimal(0),
    //数组集合
    val list_1: ArrayList<Any> = arrayListOf(),
    val list_2: ArrayList<String> = arrayListOf(),
    val list_3: ArrayList<Boolean> = arrayListOf(),
    val list_4: ArrayList<Int> = arrayListOf(),
    val list_5: ArrayList<Long> = arrayListOf(),
    val list_6: ArrayList<Float> = arrayListOf(),
    val list_7: ArrayList<Double> = arrayListOf(),
    val list_8: ArrayList<BigDecimal> = arrayListOf(),
    val list_9: ArrayList<TestBean> = arrayListOf(),
    val list_10: ArrayList<ArrayList<Any>> = arrayListOf(),
    val list_11: ArrayList<HashMap<String, Any>> = arrayListOf(),
    //Map集合
    val map_1: HashMap<String, Any> = hashMapOf(),
    val map_2: HashMap<String, String> = hashMapOf(),
    val map_3: HashMap<String, Boolean> = hashMapOf(),
    val map_4: HashMap<String, Int> = hashMapOf(),
    val map_5: HashMap<String, Long> = hashMapOf(),
    val map_6: HashMap<String, Float> = hashMapOf(),
    val map_7: HashMap<String, Double> = hashMapOf(),
    val map_8: HashMap<String, BigDecimal> = hashMapOf(),
    val map_9: HashMap<String, TestBean> = hashMapOf(),
    val map_10: HashMap<String, ArrayList<Any>> = hashMapOf(),
    val map_11: HashMap<String, HashMap<String, Any>> = hashMapOf(),
)

/**
 * 容错的范围
 * 新增了"\"字符串\"",因经测试发现空字符串和有字符串的情况下,测试表现不同
 */
private val faultRange = arrayListOf(null, "\"\"", "\"字符串\"", false, 0, 0.0, "{}", "[]")

fun main() {
    /****** 数组集合 ******/

    //数组集合-外层容错
    sample_1_by_list()  //结果: ❌ 

    //数组集合-泛型容错<String>
    sample_2_by_list()  //结果: ❌ 

    //数组集合-泛型容错<Boolean>
    sample_3_by_list()  //结果: ❌ 

    //数组集合-泛型容错<Int>
    sample_4_by_list()  //结果: ❌ 

    //数组集合-泛型容错<Long>
    sample_5_by_list()  //结果: ❌ 

    //数组集合-泛型容错<Float>
    sample_6_by_list()  //结果: ❌ 

    //数组集合-泛型容错<Double>
    sample_7_by_list()  //结果: ❌ 

    //数组集合-泛型容错<BigDecimal>
    sample_8_by_list()  //结果: ❌ 

    //数组集合-泛型容错<Bean对象>
    sample_9_by_list()  //结果: ❌ 

    //数组集合-泛型容错<数组集合>
    sample_10_by_list() //结果: ❌ 

    //数组集合-泛型容错<Map集合>
    sample_11_by_list() //结果: ❌ 

    /****** Map集合 ******/

    //Map集合-外层容错
    sample_1_by_map()   //结果: ❌ 

    //Map集合-泛型容错<String,String>
    sample_2_by_map()   //结果: ❌ 

    //Map集合-泛型容错<String,Boolean>
    sample_3_by_map()   //结果: ❌ 

    //Map集合-泛型容错<String,Int>
    sample_4_by_map()   //结果: ❌ 

    //Map集合-泛型容错<String,Long>
    sample_5_by_map()   //结果: ❌ 

    //Map集合-泛型容错<String,Float>
    sample_6_by_map()   //结果: ❌ 

    //Map集合-泛型容错<String,Double>
    sample_7_by_map()   //结果: ❌

    //Map集合-泛型容错<String,BigDecimal>
    sample_8_by_map()   //结果: ❌

    //Map集合-泛型容错<String,Bean对象>
    sample_9_by_map()   //结果: ❌

    //Map集合-泛型容错<String,数组集合>
    sample_10_by_map()   //结果: ❌

    //Map集合-泛型容错<String,Map集合>
    sample_11_by_map()   //结果: ❌

    /****** Bean类 ******/

    //Bean类-基本类型(String)
    sample_1_base_by_bean() //结果: ✅

    //Bean类-基本类型(Boolean)
    sample_2_base_by_bean() //结果: ✅

    //Bean类-基本类型(Int)
    sample_3_base_by_bean() //结果: ✅

    //Bean类-基本类型(Long)
    sample_4_base_by_bean() //结果: ✅

    //Bean类-基本类型(Float)
    sample_5_base_by_bean() //结果: ✅

    //Bean类-基本类型(Double)
    sample_6_base_by_bean() //结果: ✅

    //Bean类-基本类型(BigDecimal)
    sample_7_base_by_bean() //结果: ✅

    //Bean类-数组集合-外层容错
    sample_1_list_by_bean() //结果: ✅

    //Bean类-数组集合-泛型容错<String>
    sample_2_list_by_bean() //结果: ❌

    //Bean类-数组集合-泛型容错<Boolean>
    sample_3_list_by_bean() //结果: ❌

    //Bean类-数组集合-泛型容错<Int>
    sample_4_list_by_bean() //结果: ❌

    //Bean类-数组集合-泛型容错<Long>
    sample_5_list_by_bean() //结果: ❌

    //Bean类-数组集合-泛型容错<Float>
    sample_6_list_by_bean() //结果: ❌

    //Bean类-数组集合-泛型容错<Double>
    sample_7_list_by_bean() //结果: ❌

    //Bean类-数组集合-泛型容错<BigDecimal>
    sample_8_list_by_bean() //结果: ❌

    //Bean类-数组集合-泛型容错<Bean对象>
    sample_9_list_by_bean() //结果: ❌

    //Bean类-数组集合-泛型容错<数组集合>
    sample_10_list_by_bean() //结果: ❌

    //Bean类-数组集合-泛型容错<Map集合>
    sample_11_list_by_bean() //结果: ❌

    //Bean类-Map集合-外层容错
    sample_1_map_by_bean()   //结果: ✅

    //Bean类-Map集合-泛型容错<String,String>
    sample_2_map_by_bean()   //结果: ❌

    //Bean类-Map集合-泛型容错<String,Boolean>
    sample_3_map_by_bean()   //结果: ❌

    //Bean类-Map集合-泛型容错<String,Int>
    sample_4_map_by_bean()   //结果: ❌

    //Bean类-Map集合-泛型容错<String,Long>
    sample_5_map_by_bean()   //结果: ❌

    //Bean类-Map集合-泛型容错<String,Float>
    sample_6_map_by_bean()   //结果: ❌

    //Bean类-Map集合-泛型容错<String,Double>
    sample_7_map_by_bean()   //结果: ❌

    //Bean类-Map集合-泛型容错<String,BigDecimal>
    sample_8_map_by_bean()   //结果: ❌

    //Bean类-Map集合-泛型容错<String,Bean对象>
    sample_9_map_by_bean()   //结果: ❌

    //Bean类-Map集合-泛型容错<String,数组集合>
    sample_10_map_by_bean()   //结果: ❌

    //Bean类-Map集合-泛型容错<String,Map集合>
    sample_11_map_by_bean()   //结果: ❌
}

fun sample_1_by_list() {
    println("数组集合-外层容错")
    faultRange.forEachIndexed { index, it ->
        val json = "${it}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson<ArrayList<Any>>(json, object : TypeToken<ArrayList<Any>>() {}.type)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(bean))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① null -> null
    //② "" -> null
    //③ "字符串" -> null
    //④ false -> null
    //⑤ 0 -> null
    //⑥ 0.0 -> null
    //⑦ {} -> null
    //⑧ [] -> []
    //验证是否通过: ❌ 第1、2、3、4、5、6、7 结果不对
    //建议: 解析成ArrayList时, 类型不匹配会返回null, 但在其他地方则不会null, 比如bean对象中的list。不兼容的话在调用时还是会null空指针的 ,后续凡是返回有null值的 ,参考这条。
}

fun sample_2_by_list() {
    println("数组集合-泛型容错<String>")
    faultRange.forEachIndexed { index, it ->
        val json = "[${it}]"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson<ArrayList<String>>(json, object : TypeToken<ArrayList<String>>() {}.type)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(bean))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① [null] -> [null]
    //② [""] -> [""]
    //③ ["字符串"] -> ["字符串"]
    //④ [false] -> ["false"]
    //⑤ [0] -> ["0"]
    //⑥ [0.0] -> ["0.0"]
    //⑦ [{}] -> java.lang.IllegalArgumentException
    //⑧ [[]] -> java.lang.IllegalArgumentException
    //验证是否通过: ❌ 第1、7、8 结果不对
}

fun sample_3_by_list() {
    println("数组集合-泛型容错<Boolean>")
    faultRange.forEachIndexed { index, it ->
        val json = "[${it}]"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson<ArrayList<Boolean>>(json, object : TypeToken<ArrayList<Boolean>>() {}.type)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(bean))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① [null] -> [null]
    //② [""] -> [false]
    //③ ["字符串"] -> [false]
    //④ [false] -> [false]
    //⑤ [0] -> [false]
    //⑥ [0.0] -> [false]
    //⑦ [{}] -> java.lang.IllegalArgumentException
    //⑧ [[]] -> java.lang.IllegalArgumentException
    //验证是否通过: ❌ 第1、7、8 结果不对
}

fun sample_4_by_list() {
    println("数组集合-泛型容错<Int>")
    faultRange.forEachIndexed { index, it ->
        val json = "[${it}]"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson<ArrayList<Int>>(json, object : TypeToken<ArrayList<Int>>() {}.type)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(bean))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① [null] -> [null]
    //② [""] -> [0]
    //③ ["字符串"] -> java.lang.NumberFormatException: Character 字 is neither a decimal digit number, decimal point, nor "e" notation exponential mark.
    //④ [false] -> java.lang.IllegalArgumentException
    //⑤ [0] -> [0]
    //⑥ [0.0] -> [0]
    //⑦ [{}] -> java.lang.IllegalArgumentException
    //⑧ [[]] -> java.lang.IllegalArgumentException
    //验证是否通过: ❌ 第1、3、4、7、8 结果不对
}

fun sample_5_by_list() {
    println("数组集合-泛型容错<Long>")
    faultRange.forEachIndexed { index, it ->
        val json = "[${it}]"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson<ArrayList<Long>>(json, object : TypeToken<ArrayList<Long>>() {}.type)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(bean))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① [null] -> [null]
    //② [""] -> [0]
    //③ ["字符串"] -> java.lang.NumberFormatException: Character 字 is neither a decimal digit number, decimal point, nor "e" notation exponential mark.
    //④ [false] -> java.lang.IllegalArgumentException
    //⑤ [0] -> [0]
    //⑥ [0.0] -> [0]
    //⑦ [{}] -> java.lang.IllegalArgumentException
    //⑧ [[]] -> java.lang.IllegalArgumentException
    //验证是否通过: ❌ 第1、3、4、7、8 结果不对
}

fun sample_6_by_list() {
    println("数组集合-泛型容错<Float>")
    faultRange.forEachIndexed { index, it ->
        val json = "[${it}]"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson<ArrayList<Float>>(json, object : TypeToken<ArrayList<Float>>() {}.type)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(bean))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① [null] -> [null]
    //② [""] -> [0.0]
    //③ ["字符串"] -> java.lang.NumberFormatException: For input string: "字符串"
    //④ [false] -> java.lang.IllegalArgumentException
    //⑤ [0] -> [0.0]
    //⑥ [0.0] -> [0.0]
    //⑦ [{}] -> java.lang.IllegalArgumentException
    //⑧ [[]] -> java.lang.IllegalArgumentException
    //验证是否通过: ❌ 第1、3、4、7、8 结果不对
}

fun sample_7_by_list() {
    println("数组集合-泛型容错<Double>")
    faultRange.forEachIndexed { index, it ->
        val json = "[${it}]"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson<ArrayList<Double>>(json, object : TypeToken<ArrayList<Double>>() {}.type)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(bean))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① [null] -> [null]
    //② [""] -> [0.0]
    //③ ["字符串"] -> java.lang.NumberFormatException: For input string: "字符串"
    //④ [false] -> java.lang.IllegalArgumentException
    //⑤ [0] -> [0.0]
    //⑥ [0.0] -> [0.0]
    //⑦ [{}] -> java.lang.IllegalArgumentException
    //⑧ [[]] -> java.lang.IllegalArgumentException
    //验证是否通过: ❌ 第1、3、4、7、8 结果不对
}

fun sample_8_by_list() {
    println("数组集合-泛型容错<BigDecimal>")
    faultRange.forEachIndexed { index, it ->
        val json = "[${it}]"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson<ArrayList<BigDecimal>>(json, object : TypeToken<ArrayList<BigDecimal>>() {}.type)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(bean))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① [null] -> [null]
    //② [""] -> [0]
    //③ ["字符串"] -> java.lang.NumberFormatException: Character 字 is neither a decimal digit number, decimal point, nor "e" notation exponential mark.
    //④ [false] -> [null]
    //⑤ [0] -> [0]
    //⑥ [0.0] -> [0.0]
    //⑦ [{}] -> [null]
    //⑧ [[]] -> [null]
    //验证是否通过: ❌ 第1、3、4、7、8 结果不对
}

fun sample_9_by_list() {
    println("数组集合-泛型容错<Bean对象>")
    faultRange.forEachIndexed { index, it ->
        val json = "[${it}]"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson<ArrayList<TestBean>>(json, object : TypeToken<ArrayList<TestBean>>() {}.type)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(bean))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① [null] -> [null]
    //② [""] -> [null]
    //③ ["字符串"] -> [null]
    //④ [false] -> [null]
    //⑤ [0] -> [null]
    //⑥ [0.0] -> [null]
    //⑦ [{}] -> [{"base_1":"","base_2":false,"base_3":0,"base_4":0,"base_5":0.0,"base_6":0.0,"base_7":0,"list_1":[],"list_2":[],"list_3":[],"list_4":[],"list_5":[],"list_6":[],"list_7":[],"list_8":[],"list_9":[],"list_10":[],"list_11":[],"map_1":{},"map_2":{},"map_3":{},"map_4":{},"map_5":{},"map_6":{},"map_7":{},"map_8":{},"map_9":{},"map_10":{},"map_11":{}}]
    //⑧ [[]] -> [null]
    //验证是否通过: ❌ 第1、2、3、4、5、6、8 结果不对
}

fun sample_10_by_list() {
    println("数组集合-泛型容错<数组集合>")
    faultRange.forEachIndexed { index, it ->
        val json = "[${it}]"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson<ArrayList<ArrayList<Any>>>(json, object : TypeToken<ArrayList<ArrayList<Any>>>() {}.type)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(bean))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① [null] -> [null]
    //② [""] -> [null]
    //③ ["字符串"] -> [null]
    //④ [false] -> [null]
    //⑤ [0] -> [null]
    //⑥ [0.0] -> [null]
    //⑦ [{}] -> [null]
    //⑧ [[]] -> [[]]
    //验证是否通过: ❌ 第1、2、3、4、5、6、7 结果不对
}

fun sample_11_by_list() {
    println("数组集合-泛型容错<Map集合>")
    faultRange.forEachIndexed { index, it ->
        val json = "[${it}]"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson<ArrayList<HashMap<String, Any>>>(json, object : TypeToken<ArrayList<HashMap<String, Any>>>() {}.type)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(bean))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① [null] -> [null]
    //② [""] -> [{}]
    //③ ["字符串"] -> [{}]
    //④ [false] -> [{}]
    //⑤ [0] -> [{}]
    //⑥ [0.0] -> [{}]
    //⑦ [{}] -> [{}]
    //⑧ [[]] -> [{}]
    //验证是否通过: ❌ 第1 结果不对
}

fun sample_1_by_map() {
    println("Map集合-外层容错")
    faultRange.forEachIndexed { index, it ->
        val json = "${it}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson<HashMap<String, Any>>(json, object : TypeToken<HashMap<String, Any>>() {}.type)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(bean))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① null -> null
    //② "" -> {}
    //③ "字符串" -> {}
    //④ false -> {}
    //⑤ 0 -> {}
    //⑥ 0.0 -> {}
    //⑦ {} -> {}
    //⑧ [] -> {}
    //验证是否通过: ❌ 第1 结果不对
}

fun sample_2_by_map() {
    println("Map集合-泛型容错<String,String>")
    faultRange.forEachIndexed { index, it ->
        val json = "{${it}}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson<HashMap<String, String>>(json, object : TypeToken<HashMap<String, String>>() {}.type)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(bean))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {null} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 7 path $.
    //② {""} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 5 path $.
    //③ {"字符串"} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 8 path $.
    //④ {false} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 8 path $.
    //⑤ {0} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 4 path $.
    //⑥ {0.0} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 6 path $.
    //⑦ {{}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.
    //⑧ {[]} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.
    //验证是否通过: ❌ 第1、2、3、4、5、6、7、8 结果不对
}

fun sample_3_by_map() {
    println("Map集合-泛型容错<String,Boolean>")
    faultRange.forEachIndexed { index, it ->
        val json = "{${it}}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson<HashMap<String, Boolean>>(json, object : TypeToken<HashMap<String, Boolean>>() {}.type)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(bean))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {null} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 7 path $.
    //② {""} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 5 path $.
    //③ {"字符串"} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 8 path $.
    //④ {false} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 8 path $.
    //⑤ {0} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 4 path $.
    //⑥ {0.0} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 6 path $.
    //⑦ {{}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.
    //⑧ {[]} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.
    //验证是否通过: ❌ 第1、2、3、4、5、6、7、8 结果不对
}

fun sample_4_by_map() {
    println("Map集合-泛型容错<String,Int>")
    faultRange.forEachIndexed { index, it ->
        val json = "{${it}}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson<HashMap<String, Int>>(json, object : TypeToken<HashMap<String, Int>>() {}.type)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(bean))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {null} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 7 path $.
    //② {""} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 5 path $.
    //③ {"字符串"} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 8 path $.
    //④ {false} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 8 path $.
    //⑤ {0} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 4 path $.
    //⑥ {0.0} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 6 path $.
    //⑦ {{}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.
    //⑧ {[]} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.
    //验证是否通过: ❌ 第1、2、3、4、5、6、7、8 结果不对
}

fun sample_5_by_map() {
    println("Map集合-泛型容错<String,Long>")
    faultRange.forEachIndexed { index, it ->
        val json = "{${it}}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson<HashMap<String, Long>>(json, object : TypeToken<HashMap<String, Long>>() {}.type)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(bean))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {null} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 7 path $.
    //② {""} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 5 path $.
    //③ {"字符串"} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 8 path $.
    //④ {false} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 8 path $.
    //⑤ {0} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 4 path $.
    //⑥ {0.0} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 6 path $.
    //⑦ {{}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.
    //⑧ {[]} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.
    //验证是否通过: ❌ 第1、2、3、4、5、6、7、8 结果不对
}

fun sample_6_by_map() {
    println("Map集合-泛型容错<String,Float>")
    faultRange.forEachIndexed { index, it ->
        val json = "{${it}}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson<HashMap<String, Float>>(json, object : TypeToken<HashMap<String, Float>>() {}.type)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(bean))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {null} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 7 path $.
    //② {""} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 5 path $.
    //③ {"字符串"} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 8 path $.
    //④ {false} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 8 path $.
    //⑤ {0} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 4 path $.
    //⑥ {0.0} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 6 path $.
    //⑦ {{}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.
    //⑧ {[]} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.
    //验证是否通过: ❌ 第1、2、3、4、5、6、7、8 结果不对
}

fun sample_7_by_map() {
    println("Map集合-泛型容错<String,Double>")
    faultRange.forEachIndexed { index, it ->
        val json = "{${it}}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson<HashMap<String, Double>>(json, object : TypeToken<HashMap<String, Double>>() {}.type)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(bean))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {null} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 7 path $.
    //② {""} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 5 path $.
    //③ {"字符串"} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 8 path $.
    //④ {false} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 8 path $.
    //⑤ {0} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 4 path $.
    //⑥ {0.0} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 6 path $.
    //⑦ {{}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.
    //⑧ {[]} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.
    //验证是否通过: ❌ 第1、2、3、4、5、6、7、8 结果不对
}

fun sample_8_by_map() {
    println("Map集合-泛型容错<String,BigDecimal>")
    faultRange.forEachIndexed { index, it ->
        val json = "{${it}}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson<HashMap<String, BigDecimal>>(json, object : TypeToken<HashMap<String, BigDecimal>>() {}.type)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(bean))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {null} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 7 path $.
    //② {""} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 5 path $.
    //③ {"字符串"} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 8 path $.
    //④ {false} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 8 path $.
    //⑤ {0} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 4 path $.
    //⑥ {0.0} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 6 path $.
    //⑦ {{}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.
    //⑧ {[]} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.
    //验证是否通过: ❌ 第1、2、3、4、5、6、7、8 结果不对
}

fun sample_9_by_map() {
    println("Map集合-泛型容错<String,Bean对象>")
    faultRange.forEachIndexed { index, it ->
        val json = "{${it}}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson<HashMap<String, TestBean>>(json, object : TypeToken<HashMap<String, TestBean>>() {}.type)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(bean))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {null} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 7 path $.
    //② {""} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 5 path $.
    //③ {"字符串"} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 8 path $.
    //④ {false} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 8 path $.
    //⑤ {0} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 4 path $.
    //⑥ {0.0} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 6 path $.
    //⑦ {{}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.
    //⑧ {[]} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.
    //验证是否通过: ❌ 第1、2、3、4、5、6、7、8 结果不对
}

fun sample_10_by_map() {
    println("Map集合-泛型容错<String,数组集合>")
    faultRange.forEachIndexed { index, it ->
        val json = "{${it}}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson<HashMap<String, ArrayList<Any>>>(json, object : TypeToken<HashMap<String, TestBean>>() {}.type)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(bean))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {null} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 7 path $.
    //② {""} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 5 path $.
    //③ {"字符串"} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 8 path $.
    //④ {false} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 8 path $.
    //⑤ {0} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 4 path $.
    //⑥ {0.0} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 6 path $.
    //⑦ {{}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.
    //⑧ {[]} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.
    //验证是否通过: ❌ 第1、2、3、4、5、6、7、8 结果不对
}

fun sample_11_by_map() {
    println("Map集合-泛型容错<String,Map集合>")
    faultRange.forEachIndexed { index, it ->
        val json = "{${it}}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson<HashMap<String, HashMap<String, Any>>>(json, object : TypeToken<HashMap<String, HashMap<String, Any>>>() {}.type)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(bean))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {null} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 7 path $.
    //② {""} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 5 path $.
    //③ {"字符串"} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 8 path $.
    //④ {false} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 8 path $.
    //⑤ {0} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 4 path $.
    //⑥ {0.0} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 6 path $.
    //⑦ {{}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.
    //⑧ {[]} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.
    //验证是否通过: ❌ 第1、2、3、4、5、6、7、8 结果不对
}

fun sample_1_base_by_bean() {
    println("Bean类-基本类型(String)")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"base_1\":${it}}";
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("base_1" to bean.base_1)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"base_1":null} -> {"base_1":""}
    //② {"base_1":""} -> {"base_1":""}
    //③ {"base_1":"字符串"} -> {"base_1":"字符串"}
    //④ {"base_1":false} -> {"base_1":"false"}
    //⑤ {"base_1":0} -> {"base_1":"0"}
    //⑥ {"base_1":0.0} -> {"base_1":"0.0"}
    //⑦ {"base_1":{}} -> {"base_1":""}
    //⑧ {"base_1":[]} -> {"base_1":""}
    //验证是否通过: ✅
}

fun sample_2_base_by_bean() {
    println("Bean类-基本类型(Boolean)")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"base_2\":${it}}";
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("base_2" to bean.base_2)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"base_2":null} -> {"base_2":false}
    //② {"base_2":""} -> {"base_2":false}
    //③ {"base_2":"字符串"} -> {"base_2":false}
    //④ {"base_2":false} -> {"base_2":false}
    //⑤ {"base_2":0} -> {"base_2":false}
    //⑥ {"base_2":0.0} -> {"base_2":false}
    //⑦ {"base_2":{}} -> {"base_2":false}
    //⑧ {"base_2":[]} -> {"base_2":false}
    //验证是否通过: ✅
}

fun sample_3_base_by_bean() {
    println("Bean类-基本类型(Int)")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"base_3\":${it}}";
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("base_3" to bean.base_3)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"base_3":null} -> {"base_3":0}
    //② {"base_3":""} -> {"base_3":0}
    //③ {"base_3":"字符串"} -> {"base_3":0}
    //④ {"base_3":false} -> {"base_3":0}
    //⑤ {"base_3":0} -> {"base_3":0}
    //⑥ {"base_3":0.0} -> {"base_3":0}
    //⑦ {"base_3":{}} -> {"base_3":0}
    //⑧ {"base_3":[]} -> {"base_3":0}
    //验证是否通过: ✅
}

fun sample_4_base_by_bean() {
    println("Bean类-基本类型(Long)")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"base_4\":${it}}";
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("base_4" to bean.base_4)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"base_4":null} -> {"base_4":0}
    //② {"base_4":""} -> {"base_4":0}
    //③ {"base_4":"字符串"} -> {"base_4":0}
    //④ {"base_4":false} -> {"base_4":0}
    //⑤ {"base_4":0} -> {"base_4":0}
    //⑥ {"base_4":0.0} -> {"base_4":0}
    //⑦ {"base_4":{}} -> {"base_4":0}
    //⑧ {"base_4":[]} -> {"base_4":0}
    //验证是否通过: ✅
}

fun sample_5_base_by_bean() {
    println("Bean类-基本类型(Float)")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"base_5\":${it}}";
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("base_5" to bean.base_5)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"base_5":null} -> {"base_5":0.0}
    //② {"base_5":""} -> {"base_5":0.0}
    //③ {"base_5":"字符串"} -> {"base_5":0.0}
    //④ {"base_5":false} -> {"base_5":0.0}
    //⑤ {"base_5":0} -> {"base_5":0.0}
    //⑥ {"base_5":0.0} -> {"base_5":0.0}
    //⑦ {"base_5":{}} -> {"base_5":0.0}
    //⑧ {"base_5":[]} -> {"base_5":0.0}
    //验证是否通过: ✅
}

fun sample_6_base_by_bean() {
    println("Bean类-基本类型(Double)")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"base_6\":${it}}";
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("base_6" to bean.base_6)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"base_6":null} -> {"base_6":0.0}
    //② {"base_6":""} -> {"base_6":0.0}
    //③ {"base_6":"字符串"} -> {"base_6":0.0}
    //④ {"base_6":false} -> {"base_6":0.0}
    //⑤ {"base_6":0} -> {"base_6":0.0}
    //⑥ {"base_6":0.0} -> {"base_6":0.0}
    //⑦ {"base_6":{}} -> {"base_6":0.0}
    //⑧ {"base_6":[]} -> {"base_6":0.0}
    //验证是否通过: ✅
}

fun sample_7_base_by_bean() {
    println("Bean类-基本类型(BigDecimal)")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"base_7\":${it}}";
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("base_7" to bean.base_7)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //Bean类-基本类型(BigDecimal)
    //① {"base_7":null} -> {"base_7":0}
    //② {"base_7":""} -> {"base_7":0}
    //③ {"base_7":"字符串"} -> {"base_7":0}
    //④ {"base_7":false} -> {"base_7":0}
    //⑤ {"base_7":0} -> {"base_7":0}
    //⑥ {"base_7":0.0} -> {"base_7":0.0}
    //⑦ {"base_7":{}} -> {"base_7":0}
    //⑧ {"base_7":[]} -> {"base_7":0}
    //验证是否通过: ✅
}

fun sample_1_list_by_bean() {
    println("Bean类-数组集合-外层容错")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"list_1\":${it}}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("list_1" to bean.list_1)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"list_1":null} -> {"list_1":[]}
    //② {"list_1":""} -> {"list_1":[]}
    //③ {"list_1":"字符串"} -> {"list_1":[]}
    //④ {"list_1":false} -> {"list_1":[]}
    //⑤ {"list_1":0} -> {"list_1":[]}
    //⑥ {"list_1":0.0} -> {"list_1":[]}
    //⑦ {"list_1":{}} -> {"list_1":[]}
    //⑧ {"list_1":[]} -> {"list_1":[]}
    //验证是否通过: ✅
}

fun sample_2_list_by_bean() {
    println("Bean类-数组集合-泛型容错<String>")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"list_2\":[${it}]}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("list_2" to bean.list_2)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"list_2":[null]} -> {"list_2":[null]}
    //② {"list_2":[""]} -> {"list_2":[""]}
    //③ {"list_2":["字符串"]} -> {"list_2":["字符串"]}
    //④ {"list_2":[false]} -> {"list_2":["false"]}
    //⑤ {"list_2":[0]} -> {"list_2":["0"]}
    //⑥ {"list_2":[0.0]} -> {"list_2":["0.0"]}
    //⑦ {"list_2":[{}]} -> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected END_OBJECT but was END_ARRAY at line 1 column 15 path $.list_2[1]
    //⑧ {"list_2":[[]]} -> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected END_OBJECT but was END_ARRAY at line 1 column 15 path $.list_2[1]
    //验证是否通过: ❌ 第1、7、8结果不对
}

fun sample_3_list_by_bean() {
    println("Bean类-数组集合-泛型容错<Boolean>")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"list_3\":[${it}]}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("list_3" to bean.list_3)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"list_3":[null]} -> {"list_3":[null]}
    //② {"list_3":[""]} -> {"list_3":[false]}
    //③ {"list_3":["字符串"]} -> {"list_3":[false]}
    //④ {"list_3":[false]} -> {"list_3":[false]}
    //⑤ {"list_3":[0]} -> {"list_3":[false]}
    //⑥ {"list_3":[0.0]} -> {"list_3":[false]}
    //⑦ {"list_3":[{}]} -> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected END_OBJECT but was END_ARRAY at line 1 column 15 path $.list_3[1]
    //⑧ {"list_3":[[]]} -> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected END_OBJECT but was END_ARRAY at line 1 column 15 path $.list_3[1]
    //验证是否通过: ❌ 第1、7、8结果不对
}

fun sample_4_list_by_bean() {
    println("Bean类-数组集合-泛型容错<Int>")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"list_4\":[${it}]}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("list_4" to bean.list_4)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"list_4":[null]} -> {"list_4":[null]}
    //② {"list_4":[""]} -> {"list_4":[0]}
    //③ {"list_4":["字符串"]} -> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected END_OBJECT but was END_ARRAY at line 1 column 18 path $.list_4[1]
    //④ {"list_4":[false]} -> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected END_OBJECT but was END_ARRAY at line 1 column 18 path $.list_4[1]
    //⑤ {"list_4":[0]} -> {"list_4":[0]}
    //⑥ {"list_4":[0.0]} -> {"list_4":[0]}
    //⑦ {"list_4":[{}]} -> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected END_OBJECT but was END_ARRAY at line 1 column 15 path $.list_4[1]
    //⑧ {"list_4":[[]]} -> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected END_OBJECT but was END_ARRAY at line 1 column 15 path $.list_4[1]
    //验证是否通过: ❌ 第1、3、4、7、8 结果不对
}

fun sample_5_list_by_bean() {
    println("Bean类-数组集合-泛型容错<Long>")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"list_5\":[${it}]}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("list_5" to bean.list_5)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"list_5":[null]} -> {"list_5":[null]}
    //② {"list_5":[""]} -> {"list_5":[0]}
    //③ {"list_5":["字符串"]} -> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected END_OBJECT but was END_ARRAY at line 1 column 18 path $.list_5[1]
    //④ {"list_5":[false]} -> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected END_OBJECT but was END_ARRAY at line 1 column 18 path $.list_5[1]
    //⑤ {"list_5":[0]} -> {"list_5":[0]}
    //⑥ {"list_5":[0.0]} -> {"list_5":[0]}
    //⑦ {"list_5":[{}]} -> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected END_OBJECT but was END_ARRAY at line 1 column 15 path $.list_5[1]
    //⑧ {"list_5":[[]]} -> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected END_OBJECT but was END_ARRAY at line 1 column 15 path $.list_5[1]
    //验证是否通过: ❌ 第1、3、4、7、8 结果不对
}

fun sample_6_list_by_bean() {
    println("Bean类-数组集合-泛型容错<Float>")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"list_6\":[${it}]}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("list_6" to bean.list_6)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"list_6":[null]} -> {"list_6":[null]}
    //② {"list_6":[""]} -> {"list_6":[0.0]}
    //③ {"list_6":["字符串"]} -> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected END_OBJECT but was END_ARRAY at line 1 column 18 path $.list_6[1]
    //④ {"list_6":[false]} -> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected END_OBJECT but was END_ARRAY at line 1 column 18 path $.list_6[1]
    //⑤ {"list_6":[0]} -> {"list_6":[0.0]}
    //⑥ {"list_6":[0.0]} -> {"list_6":[0.0]}
    //⑦ {"list_6":[{}]} -> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected END_OBJECT but was END_ARRAY at line 1 column 15 path $.list_6[1]
    //⑧ {"list_6":[[]]} -> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected END_OBJECT but was END_ARRAY at line 1 column 15 path $.list_6[1]
    //验证是否通过: ❌ 第1、3、4、7、8 结果不对
}

fun sample_7_list_by_bean() {
    println("Bean类-数组集合-泛型容错<Double>")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"list_7\":[${it}]}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("list_7" to bean.list_7)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"list_7":[null]} -> {"list_7":[null]}
    //② {"list_7":[""]} -> {"list_7":[0.0]}
    //③ {"list_7":["字符串"]} -> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected END_OBJECT but was END_ARRAY at line 1 column 18 path $.list_7[1]
    //④ {"list_7":[false]} -> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected END_OBJECT but was END_ARRAY at line 1 column 18 path $.list_7[1]
    //⑤ {"list_7":[0]} -> {"list_7":[0.0]}
    //⑥ {"list_7":[0.0]} -> {"list_7":[0.0]}
    //⑦ {"list_7":[{}]} -> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected END_OBJECT but was END_ARRAY at line 1 column 15 path $.list_7[1]
    //⑧ {"list_7":[[]]} -> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected END_OBJECT but was END_ARRAY at line 1 column 15 path $.list_7[1]
    //验证是否通过: ❌ 第1、3、4、7、8 结果不对
}

fun sample_8_list_by_bean() {
    println("Bean类-数组集合-泛型容错<BigDecimal>")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"list_8\":[${it}]}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("list_8" to bean.list_8)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"list_8":[null]} -> {"list_8":[null]}
    //② {"list_8":[""]} -> {"list_8":[0]}
    //③ {"list_8":["字符串"]} -> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected END_OBJECT but was END_ARRAY at line 1 column 18 path $.list_8[1]
    //④ {"list_8":[false]} -> {"list_8":[null]}
    //⑤ {"list_8":[0]} -> {"list_8":[0]}
    //⑥ {"list_8":[0.0]} -> {"list_8":[0.0]}
    //⑦ {"list_8":[{}]} -> {"list_8":[null]}
    //⑧ {"list_8":[[]]} -> {"list_8":[null]}
    //验证是否通过: ❌ 第1、3、4、6、7、8 结果不对
}

fun sample_9_list_by_bean() {
    println("Bean类-数组集合-泛型容错<Bean对象>")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"list_9\":[${it}]}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("list_9" to bean.list_9)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"list_9":[null]} -> {"list_9":[null]}
    //② {"list_9":[""]} -> {"list_9":[null]}
    //③ {"list_9":["字符串"]} -> {"list_9":[null]}
    //④ {"list_9":[false]} -> {"list_9":[null]}
    //⑤ {"list_9":[0]} -> {"list_9":[null]}
    //⑥ {"list_9":[0.0]} -> {"list_9":[null]}
    //⑦ {"list_9":[{}]} -> {"list_9":[{"base_1":"","base_2":false,"base_3":0,"base_4":0,"base_5":0.0,"base_6":0.0,"base_7":0,"list_1":[],"list_2":[],"list_3":[],"list_4":[],"list_5":[],"list_6":[],"list_7":[],"list_8":[],"list_9":[],"list_10":[],"list_11":[],"map_1":{},"map_2":{},"map_3":{},"map_4":{},"map_5":{},"map_6":{},"map_7":{},"map_8":{},"map_9":{},"map_10":{},"map_11":{}}]}
    //⑧ {"list_9":[[]]} -> {"list_9":[null]}
    //验证是否通过: ❌ 第1、2、3、4、5、6、8 结果不对
}

fun sample_10_list_by_bean() {
    println("Bean类-数组集合-泛型容错<数组集合>")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"list_10\":[${it}]}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("list_10" to bean.list_10)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"list_10":[null]} -> {"list_10":[null]}
    //② {"list_10":[""]} -> {"list_10":[null]}
    //③ {"list_10":["字符串"]} -> {"list_10":[null]}
    //④ {"list_10":[false]} -> {"list_10":[null]}
    //⑤ {"list_10":[0]} -> {"list_10":[null]}
    //⑥ {"list_10":[0.0]} -> {"list_10":[null]}
    //⑦ {"list_10":[{}]} -> {"list_10":[null]}
    //⑧ {"list_10":[[]]} -> {"list_10":[[]]}
    //验证是否通过: ❌ 第1、2、3、4、5、6、7 结果不对
}

fun sample_11_list_by_bean() {
    println("Bean类-数组集合-泛型容错<Map集合>")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"list_11\":[${it}]}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("list_11" to bean.list_11)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"list_11":[null]} -> {"list_11":[null]}
    //② {"list_11":[""]} -> {"list_11":[{}]}
    //③ {"list_11":["字符串"]} -> {"list_11":[{}]}
    //④ {"list_11":[false]} -> {"list_11":[{}]}
    //⑤ {"list_11":[0]} -> {"list_11":[{}]}
    //⑥ {"list_11":[0.0]} -> {"list_11":[{}]}
    //⑦ {"list_11":[{}]} -> {"list_11":[{}]}
    //⑧ {"list_11":[[]]} -> {"list_11":[{}]}
    //验证是否通过: ❌ 第1 结果不对
}

fun sample_1_map_by_bean() {
    println("Bean类-Map集合-外层容错")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"map_1\":${it}}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("map_1" to bean.map_1)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"map_1":null} -> {"map_1":{}}
    //② {"map_1":""} -> {"map_1":{}}
    //③ {"map_1":"字符串"} -> {"map_1":{}}
    //④ {"map_1":false} -> {"map_1":{}}
    //⑤ {"map_1":0} -> {"map_1":{}}
    //⑥ {"map_1":0.0} -> {"map_1":{}}
    //⑦ {"map_1":{}} -> {"map_1":{}}
    //⑧ {"map_1":[]} -> {"map_1":{}}
    //验证是否通过: ✅
}

fun sample_2_map_by_bean() {
    println("Bean类-Map集合-泛型容错<String,String>")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"map_2\":{${it}}}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("map_2" to bean.map_2)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"map_11":{null}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 17 path $.map_11.
    //② {"map_11":{""}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 15 path $.map_11.
    //③ {"map_11":{"字符串"}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 18 path $.map_11.
    //④ {"map_11":{false}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 18 path $.map_11.
    //⑤ {"map_11":{0}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 14 path $.map_11.
    //⑥ {"map_11":{0.0}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 16 path $.map_11.
    //⑦ {"map_11":{{}}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 12 path $.map_11.
    //⑧ {"map_11":{[]}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 12 path $.map_11.
    //验证是否通过: ❌ 第1、2、3、4、5、6、7、8 结果不对
}

fun sample_3_map_by_bean() {
    println("Bean类-Map集合-泛型容错<String,Boolean>")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"map_3\":{${it}}}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("map_3" to bean.map_3)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"map_11":{null}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 17 path $.map_11.
    //② {"map_11":{""}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 15 path $.map_11.
    //③ {"map_11":{"字符串"}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 18 path $.map_11.
    //④ {"map_11":{false}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 18 path $.map_11.
    //⑤ {"map_11":{0}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 14 path $.map_11.
    //⑥ {"map_11":{0.0}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 16 path $.map_11.
    //⑦ {"map_11":{{}}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 12 path $.map_11.
    //⑧ {"map_11":{[]}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 12 path $.map_11.
    //验证是否通过: ❌ 第1、2、3、4、5、6、7、8 结果不对
}

fun sample_4_map_by_bean() {
    println("Bean类-Map集合-泛型容错<String,Int>")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"map_4\":{${it}}}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("map_4" to bean.map_4)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"map_11":{null}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 17 path $.map_11.
    //② {"map_11":{""}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 15 path $.map_11.
    //③ {"map_11":{"字符串"}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 18 path $.map_11.
    //④ {"map_11":{false}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 18 path $.map_11.
    //⑤ {"map_11":{0}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 14 path $.map_11.
    //⑥ {"map_11":{0.0}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 16 path $.map_11.
    //⑦ {"map_11":{{}}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 12 path $.map_11.
    //⑧ {"map_11":{[]}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 12 path $.map_11.
    //验证是否通过: ❌ 第1、2、3、4、5、6、7、8 结果不对
}

fun sample_5_map_by_bean() {
    println("Bean类-Map集合-泛型容错<String,Long>")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"map_5\":{${it}}}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("map_5" to bean.map_5)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"map_11":{null}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 17 path $.map_11.
    //② {"map_11":{""}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 15 path $.map_11.
    //③ {"map_11":{"字符串"}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 18 path $.map_11.
    //④ {"map_11":{false}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 18 path $.map_11.
    //⑤ {"map_11":{0}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 14 path $.map_11.
    //⑥ {"map_11":{0.0}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 16 path $.map_11.
    //⑦ {"map_11":{{}}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 12 path $.map_11.
    //⑧ {"map_11":{[]}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 12 path $.map_11.
    //验证是否通过: ❌ 第1、2、3、4、5、6、7、8 结果不对
}

fun sample_6_map_by_bean() {
    println("Bean类-Map集合-泛型容错<String,Float>")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"map_6\":{${it}}}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("map_6" to bean.map_6)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"map_11":{null}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 17 path $.map_11.
    //② {"map_11":{""}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 15 path $.map_11.
    //③ {"map_11":{"字符串"}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 18 path $.map_11.
    //④ {"map_11":{false}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 18 path $.map_11.
    //⑤ {"map_11":{0}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 14 path $.map_11.
    //⑥ {"map_11":{0.0}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 16 path $.map_11.
    //⑦ {"map_11":{{}}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 12 path $.map_11.
    //⑧ {"map_11":{[]}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 12 path $.map_11.
    //验证是否通过: ❌ 第1、2、3、4、5、6、7、8 结果不对
}

fun sample_7_map_by_bean() {
    println("Bean类-Map集合-泛型容错<String,Double>")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"map_7\":{${it}}}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("map_7" to bean.map_7)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"map_11":{null}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 17 path $.map_11.
    //② {"map_11":{""}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 15 path $.map_11.
    //③ {"map_11":{"字符串"}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 18 path $.map_11.
    //④ {"map_11":{false}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 18 path $.map_11.
    //⑤ {"map_11":{0}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 14 path $.map_11.
    //⑥ {"map_11":{0.0}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 16 path $.map_11.
    //⑦ {"map_11":{{}}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 12 path $.map_11.
    //⑧ {"map_11":{[]}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 12 path $.map_11.
    //验证是否通过: ❌ 第1、2、3、4、5、6、7、8 结果不对
}

fun sample_8_map_by_bean() {
    println("Bean类-Map集合-泛型容错<String,BigDecimal>")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"map_8\":{${it}}}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("map_8" to bean.map_8)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"map_11":{null}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 17 path $.map_11.
    //② {"map_11":{""}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 15 path $.map_11.
    //③ {"map_11":{"字符串"}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 18 path $.map_11.
    //④ {"map_11":{false}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 18 path $.map_11.
    //⑤ {"map_11":{0}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 14 path $.map_11.
    //⑥ {"map_11":{0.0}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 16 path $.map_11.
    //⑦ {"map_11":{{}}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 12 path $.map_11.
    //⑧ {"map_11":{[]}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 12 path $.map_11.
    //验证是否通过: ❌ 第1、2、3、4、5、6、7、8 结果不对
}

fun sample_9_map_by_bean() {
    println("Bean类-Map集合-泛型容错<String,Bean对象>")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"map_9\":{${it}}}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("map_9" to bean.map_9)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"map_11":{null}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 17 path $.map_11.
    //② {"map_11":{""}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 15 path $.map_11.
    //③ {"map_11":{"字符串"}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 18 path $.map_11.
    //④ {"map_11":{false}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 18 path $.map_11.
    //⑤ {"map_11":{0}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 14 path $.map_11.
    //⑥ {"map_11":{0.0}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 16 path $.map_11.
    //⑦ {"map_11":{{}}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 12 path $.map_11.
    //⑧ {"map_11":{[]}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 12 path $.map_11.
    //验证是否通过: ❌ 第1、2、3、4、5、6、7、8 结果不对
}

fun sample_10_map_by_bean() {
    println("Bean类-Map集合-泛型容错<String,数组集合>")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"map_10\":{${it}}}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("map_10" to bean.map_10)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"map_11":{null}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 17 path $.map_11.
    //② {"map_11":{""}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 15 path $.map_11.
    //③ {"map_11":{"字符串"}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 18 path $.map_11.
    //④ {"map_11":{false}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 18 path $.map_11.
    //⑤ {"map_11":{0}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 14 path $.map_11.
    //⑥ {"map_11":{0.0}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 16 path $.map_11.
    //⑦ {"map_11":{{}}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 12 path $.map_11.
    //⑧ {"map_11":{[]}} -> com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 12 path $.map_11.
    //验证是否通过: ❌ 第1、2、3、4、5、6、7、8 结果不对
}

fun sample_11_map_by_bean() {
    println("Bean类-Map集合-泛型容错<String,Map集合>")
    faultRange.forEachIndexed { index, it ->
        val json = "{\"map_11\":{${it}}}"
        try {
            val bean = GsonFactory.getSingletonGson().fromJson(json, TestBean::class.java)
            print("${number(index)} ${json} -> ")
            println(GsonFactory.getSingletonGson().toJson(mapOf("map_11" to bean.map_11)))
        } catch (e: Exception) {
            print("${number(index)} ${json} -> ")
            println(e)
        }
    }
    println("--------------------------------------------")
    //打印结果
    //① {"list_2":[null]} -> {"list_2":[null]}
    //② {"list_2":[""]} -> {"list_2":[""]}
    //③ {"list_2":["字符串"]} -> {"list_2":["字符串"]}
    //④ {"list_2":[false]} -> {"list_2":["false"]}
    //⑤ {"list_2":[0]} -> {"list_2":["0"]}
    //⑥ {"list_2":[0.0]} -> {"list_2":["0.0"]}
    //⑦ {"list_2":[{}]} -> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected END_OBJECT but was END_ARRAY at line 1 column 15 path $.list_2[1]
    //⑧ {"list_2":[[]]} -> com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected END_OBJECT but was END_ARRAY at line 1 column 15 path $.list_2[1]
    //验证是否通过: ❌ 第1、7、8结果不对
}

fun number(index: Int): String {
    return when (index) {
        0 -> "①"
        1 -> "②"
        2 -> "③"
        3 -> "④"
        4 -> "⑤"
        5 -> "⑥"
        6 -> "⑦"
        7 -> "⑧"
        else -> ""
    }
}
LIUPING789 commented 11 months ago

我居然看完了。。。

LIUPING789 commented 11 months ago

我这个觉得吧, 容错这种类试的问题,只能因项目而异,不难100%解决。
不嫌麻烦就用最原始的方式解析吧~
实事求事,不喜勿喷。

zzl313703419 commented 11 months ago

只是提出建议,没有必要优化, 合不合理, 我都没有决定权, 有些点一个人可能想不全需要补断完善的。 即使不用容错库, 也一样开发, 无非就是多点报错提示。

getActivity commented 11 months ago

GsonFactory-8.2.aar.zip

getActivity commented 11 months ago

@zzl313703419 小伙子,Map 集合类型对不上导致解析失败的问题已经修复了,你下载上面这个包试试看问题还有没有出现?

zzl313703419 commented 11 months ago

测试了下最新版aar, map和list集合解析报错都好了, 不过还存在部分null,[null]情况 同时我也简化了下流程 Test.kt.zip 应该是这一块代码导致(CollectionTypeAdapter,ReflectiveTypeAdapter)

55AD8E50-E5F7-496C-A399-34210181619A

MapTypeAdapter

B371D39A-A12F-4D5A-A37C-6EA31933A032
数组集合-外层容错
① null -> null
② "" -> null
③ "字符串" -> null
④ false -> null
⑤ 0 -> null
⑥ 0.0 -> null
⑦ {} -> null
⑧ [] -> []
--------------------------------------------
数组集合-泛型容错<String>
① [null] -> [null]
② [""] -> [""]
③ ["字符串"] -> ["字符串"]
④ [false] -> ["false"]
⑤ [0] -> ["0"]
⑥ [0.0] -> ["0.0"]
⑦ [{}] -> []
⑧ [[]] -> []
--------------------------------------------
数组集合-泛型容错<Boolean>
① [null] -> [null]
② [""] -> []
③ ["字符串"] -> []
④ [false] -> [false]
⑤ [0] -> [false]
⑥ [0.0] -> [false]
⑦ [{}] -> []
⑧ [[]] -> []
--------------------------------------------
数组集合-泛型容错<Int>
① [null] -> [null]
② [""] -> [0]
③ ["字符串"] -> []
④ [false] -> []
⑤ [0] -> [0]
⑥ [0.0] -> [0]
⑦ [{}] -> []
⑧ [[]] -> []
--------------------------------------------
数组集合-泛型容错<Long>
① [null] -> [null]
② [""] -> [0]
③ ["字符串"] -> []
④ [false] -> []
⑤ [0] -> [0]
⑥ [0.0] -> [0]
⑦ [{}] -> []
⑧ [[]] -> []
--------------------------------------------
数组集合-泛型容错<Float>
① [null] -> [null]
② [""] -> [0.0]
③ ["字符串"] -> []
④ [false] -> []
⑤ [0] -> [0.0]
⑥ [0.0] -> [0.0]
⑦ [{}] -> []
⑧ [[]] -> []
--------------------------------------------
数组集合-泛型容错<Double>
① [null] -> [null]
② [""] -> [0.0]
③ ["字符串"] -> []
④ [false] -> []
⑤ [0] -> [0.0]
⑥ [0.0] -> [0.0]
⑦ [{}] -> []
⑧ [[]] -> []
--------------------------------------------
数组集合-泛型容错<BigDecimal>
① [null] -> [null]
② [""] -> [0]
③ ["字符串"] -> []
④ [false] -> []
⑤ [0] -> [0]
⑥ [0.0] -> [0.0]
⑦ [{}] -> []
⑧ [[]] -> []
--------------------------------------------
数组集合-泛型容错<Bean对象>
① [null] -> [null]
② [""] -> [null]
③ ["字符串"] -> [null]
④ [false] -> [null]
⑤ [0] -> [null]
⑥ [0.0] -> [null]
⑦ [{}] -> [{"base_1":"","base_2":false,"base_3":0,"base_4":0,"base_5":0.0,"base_6":0.0,"base_7":0}]
⑧ [[]] -> [null]
--------------------------------------------
数组集合-泛型容错<数组集合>
① [null] -> [null]
② [""] -> [null]
③ ["字符串"] -> [null]
④ [false] -> [null]
⑤ [0] -> [null]
⑥ [0.0] -> [null]
⑦ [{}] -> [null]
⑧ [[]] -> [[]]
--------------------------------------------
数组集合-泛型容错<Map集合>
① [null] -> [null]
② [""] -> [{}]
③ ["字符串"] -> [{}]
④ [false] -> [{}]
⑤ [0] -> [{}]
⑥ [0.0] -> [{}]
⑦ [{}] -> [{}]
⑧ [[]] -> [{}]
--------------------------------------------
Map集合-外层容错
① null -> null
② "" -> {}
③ "字符串" -> {}
④ false -> {}
⑤ 0 -> {}
⑥ 0.0 -> {}
⑦ {} -> {}
⑧ [] -> {}
--------------------------------------------
Map集合-泛型容错<String,String>
① {"demo":null} -> {}
② {"demo":""} -> {"demo":""}
③ {"demo":"字符串"} -> {"demo":"字符串"}
④ {"demo":false} -> {"demo":"false"}
⑤ {"demo":0} -> {"demo":"0"}
⑥ {"demo":0.0} -> {"demo":"0.0"}
⑦ {"demo":{}} -> {}
⑧ {"demo":[]} -> {}
--------------------------------------------
Map集合-泛型容错<String,Boolean>
① {"demo":null} -> {}
② {"demo":""} -> {}
③ {"demo":"字符串"} -> {}
④ {"demo":false} -> {"demo":false}
⑤ {"demo":0} -> {"demo":false}
⑥ {"demo":0.0} -> {"demo":false}
⑦ {"demo":{}} -> {}
⑧ {"demo":[]} -> {}
--------------------------------------------
Map集合-泛型容错<String,Int>
① {"demo":null} -> {}
② {"demo":""} -> {"demo":0}
③ {"demo":"字符串"} -> {}
④ {"demo":false} -> {}
⑤ {"demo":0} -> {"demo":0}
⑥ {"demo":0.0} -> {"demo":0}
⑦ {"demo":{}} -> {}
⑧ {"demo":[]} -> {}
--------------------------------------------
Map集合-泛型容错<String,Long>
① {"demo":null} -> {}
② {"demo":""} -> {"demo":0}
③ {"demo":"字符串"} -> {}
④ {"demo":false} -> {}
⑤ {"demo":0} -> {"demo":0}
⑥ {"demo":0.0} -> {"demo":0}
⑦ {"demo":{}} -> {}
⑧ {"demo":[]} -> {}
--------------------------------------------
Map集合-泛型容错<String,Float>
① {"demo":null} -> {}
② {"demo":""} -> {"demo":0.0}
③ {"demo":"字符串"} -> {}
④ {"demo":false} -> {}
⑤ {"demo":0} -> {"demo":0.0}
⑥ {"demo":0.0} -> {"demo":0.0}
⑦ {"demo":{}} -> {}
⑧ {"demo":[]} -> {}
--------------------------------------------
Map集合-泛型容错<String,Double>
① {"demo":null} -> {}
② {"demo":""} -> {"demo":0.0}
③ {"demo":"字符串"} -> {}
④ {"demo":false} -> {}
⑤ {"demo":0} -> {"demo":0.0}
⑥ {"demo":0.0} -> {"demo":0.0}
⑦ {"demo":{}} -> {}
⑧ {"demo":[]} -> {}
--------------------------------------------
Map集合-泛型容错<String,BigDecimal>
① {"demo":null} -> {}
② {"demo":""} -> {"demo":0}
③ {"demo":"字符串"} -> {}
④ {"demo":false} -> {}
⑤ {"demo":0} -> {"demo":0}
⑥ {"demo":0.0} -> {"demo":0.0}
⑦ {"demo":{}} -> {}
⑧ {"demo":[]} -> {}
--------------------------------------------
Map集合-泛型容错<String,Bean对象>
① {"demo":null} -> {}
② {"demo":""} -> {}
③ {"demo":"字符串"} -> {}
④ {"demo":false} -> {}
⑤ {"demo":0} -> {}
⑥ {"demo":0.0} -> {}
⑦ {"demo":{}} -> {"demo":{"base_1":"","base_2":false,"base_3":0,"base_4":0,"base_5":0.0,"base_6":0.0,"base_7":0}}
⑧ {"demo":[]} -> {}
--------------------------------------------
Map集合-泛型容错<String,数组集合>
① {"demo":null} -> {}
② {"demo":""} -> {}
③ {"demo":"字符串"} -> {}
④ {"demo":false} -> {}
⑤ {"demo":0} -> {}
⑥ {"demo":0.0} -> {}
⑦ {"demo":{}} -> {}
⑧ {"demo":[]} -> {"demo":[]}
--------------------------------------------
Map集合-泛型容错<String,Map集合>
① {"demo":null} -> {}
② {"demo":""} -> {"demo":{}}
③ {"demo":"字符串"} -> {"demo":{}}
④ {"demo":false} -> {"demo":{}}
⑤ {"demo":0} -> {"demo":{}}
⑥ {"demo":0.0} -> {"demo":{}}
⑦ {"demo":{}} -> {"demo":{}}
⑧ {"demo":[]} -> {"demo":{}}
--------------------------------------------
Bean类
① null -> null
② "" -> null
③ "字符串" -> null
④ false -> null
⑤ 0 -> null
⑥ 0.0 -> null
⑦ {} -> {"base_1":"","base_2":false,"base_3":0,"base_4":0,"base_5":0.0,"base_6":0.0,"base_7":0}
⑧ [] -> null
--------------------------------------------
Bean类-基本类型(String)
① {"base_1":null} -> {"base_1":""}
② {"base_1":""} -> {"base_1":""}
③ {"base_1":"字符串"} -> {"base_1":"字符串"}
④ {"base_1":false} -> {"base_1":"false"}
⑤ {"base_1":0} -> {"base_1":"0"}
⑥ {"base_1":0.0} -> {"base_1":"0.0"}
⑦ {"base_1":{}} -> {"base_1":""}
⑧ {"base_1":[]} -> {"base_1":""}
--------------------------------------------
Bean类-基本类型(Boolean)
① {"base_2":null} -> {"base_2":false}
② {"base_2":""} -> {"base_2":false}
③ {"base_2":"字符串"} -> {"base_2":false}
④ {"base_2":false} -> {"base_2":false}
⑤ {"base_2":0} -> {"base_2":false}
⑥ {"base_2":0.0} -> {"base_2":false}
⑦ {"base_2":{}} -> {"base_2":false}
⑧ {"base_2":[]} -> {"base_2":false}
--------------------------------------------
Bean类-基本类型(Int)
① {"base_3":null} -> {"base_3":0}
② {"base_3":""} -> {"base_3":0}
③ {"base_3":"字符串"} -> {"base_3":0}
④ {"base_3":false} -> {"base_3":0}
⑤ {"base_3":0} -> {"base_3":0}
⑥ {"base_3":0.0} -> {"base_3":0}
⑦ {"base_3":{}} -> {"base_3":0}
⑧ {"base_3":[]} -> {"base_3":0}
--------------------------------------------
Bean类-基本类型(Long)
① {"base_4":null} -> {"base_4":0}
② {"base_4":""} -> {"base_4":0}
③ {"base_4":"字符串"} -> {"base_4":0}
④ {"base_4":false} -> {"base_4":0}
⑤ {"base_4":0} -> {"base_4":0}
⑥ {"base_4":0.0} -> {"base_4":0}
⑦ {"base_4":{}} -> {"base_4":0}
⑧ {"base_4":[]} -> {"base_4":0}
--------------------------------------------
Bean类-基本类型(Float)
① {"base_5":null} -> {"base_5":0.0}
② {"base_5":""} -> {"base_5":0.0}
③ {"base_5":"字符串"} -> {"base_5":0.0}
④ {"base_5":false} -> {"base_5":0.0}
⑤ {"base_5":0} -> {"base_5":0.0}
⑥ {"base_5":0.0} -> {"base_5":0.0}
⑦ {"base_5":{}} -> {"base_5":0.0}
⑧ {"base_5":[]} -> {"base_5":0.0}
--------------------------------------------
Bean类-基本类型(Double)
① {"base_6":null} -> {"base_6":0.0}
② {"base_6":""} -> {"base_6":0.0}
③ {"base_6":"字符串"} -> {"base_6":0.0}
④ {"base_6":false} -> {"base_6":0.0}
⑤ {"base_6":0} -> {"base_6":0.0}
⑥ {"base_6":0.0} -> {"base_6":0.0}
⑦ {"base_6":{}} -> {"base_6":0.0}
⑧ {"base_6":[]} -> {"base_6":0.0}
--------------------------------------------
Bean类-基本类型(BigDecimal)
① {"base_7":null} -> {"base_7":0}
② {"base_7":""} -> {"base_7":0}
③ {"base_7":"字符串"} -> {"base_7":0}
④ {"base_7":false} -> {"base_7":0}
⑤ {"base_7":0} -> {"base_7":0}
⑥ {"base_7":0.0} -> {"base_7":0.0}
⑦ {"base_7":{}} -> {"base_7":0}
⑧ {"base_7":[]} -> {"base_7":0}
--------------------------------------------
getActivity commented 10 months ago

@zzl313703419 小伙子,我斟酌了许久,最终采纳这个建议,将后台返回 null 和返回错误数据的情况,返回一个不为空但是集合大小为 0 的 List 和 Map 对象,目前改动的代码提交,并且远程依赖已经更新,更新一下到框架 9.0 版本 即可。

zzl313703419 commented 10 months ago

好的 辛苦了 更新至9.0版本 测下来 null减少了部分 还剩下一点 有劳再看下 1.ReflectiveTypeAdapter

2B019DC5-C841-4F53-B96A-3A658A26BC16

2.data包下所有的TypeAdapter

2791D678-2932-4B70-9EB4-3A9D5F2D733D
getActivity commented 10 months ago

@zzl313703419 小伙子,很抱歉,我现在才看到这个回复,对于你提的两个问题,我分别做一下回答:

  1. Bean 类型的对象是可能为空的,合情合理,正常的开发思维不会有人将 Bean 类设置成非空的,因为这不符合常理
  2. 另外基本数据类型对象返回非空的问题,我认为不能这样做,要根据不同情况分析:

    • Java:在 Java 语言中,有 Float 和 float 类型,float 是基本数据类型,默认值为 0,而 Float 是对象,默认值为 null,如果按照你的想法来,那么他们两个的结果是一样的,都会是零,如果别人想要非空的值,那么就会使用 float 类型,而不是 Float 类型,如果人家使用了 Float 类型,那么证明别人很可能需要知道后台是否有返回 Float 类型的数值,或者返回的是否为空。

    • Kotlin:在 Kotlin 语言中,只有 Float 类型,但是直接返回 0,可能是比较好的做法,因为框架里面有一段代码逻辑,在给 Bean 赋值的时候,如果此时后台返回的值为空,那么就不会给字段赋值,这样字段就会使用它的默认值,你可以通过给字段赋值达到不为空的目的。

image
zzl313703419 commented 9 months ago

其实我想表达的是在泛型下,因为不能指定泛型的默认值,在调用时还是会出现null情况的 举个例子(map集合同理) val list: ArrayList< String > = arrayListOf() 如果这时候服务器返回的是{list:[null,null,null,"字符"]} 解析出来还是[null,null,null,"字符"],在调用时就会遇到空指针问题了,针对这种泛型没有默认值的基础类型

这种情况,因为没有统一答案,可以返回下面4种情况 1.不对null最任何处理->[null,null,null,"字符"] 1.过滤掉null -> ["字符"] 2.null变成默认值""(这里根据定义的基础类型会变化) -> ["","","","字符"] 3.列表中只要有一个null,该数组长度就为0 -> []

这就涉及到我想在后面提的第二处优化了,涉及到用户想要哪种泛型方案了,比如有个全局配置之类 ,或者对单次解析也能单独生效。对于泛型的默认值提供配置之类。

getActivity commented 9 months ago

其实我想表达的是在泛型下,因为不能指定泛型的默认值,在调用时还是会出现null情况的 举个例子(map集合同理) val list: ArrayList< String > = arrayListOf() 如果这时候服务器返回的是{list:[null,null,null,"字符"]} 解析出来还是[null,null,null,"字符"],在调用时就会遇到空指针问题了,针对这种泛型没有默认值的基础类型

这种情况,因为没有统一答案,可以返回下面4种情况 1.不对null最任何处理->[null,null,null,"字符"] 1.过滤掉null -> ["字符"] 2.null变成默认值""(这里根据定义的基础类型会变化) -> ["","","","字符"] 3.列表中只要有一个null,该数组长度就为0 -> []

这就涉及到我想在后面提的第二处优化了,涉及到用户想要哪种泛型方案了,比如有个全局配置之类 ,或者对单次解析也能单独生效。对于泛型的默认值提供配置之类。

小伙子,这个想法大概率不会被采纳,因为违背了一些基本的原则

  1. 后台返回 null 的条目,这种不是数据容错了,而是故意而为之
  2. 强行把 null 剔除掉,会改变集合的大小,返回 4 条列表数据,但是在 app 中只有 1 条的情况

针对这种场景,建议你自定义 List 类型,可以继承 ArrayList,重写 add 方法,如果不为空则不去调用 super.add 方法

zzl313703419 commented 9 months ago

问题1、后台返回 null 的条目,这种不是数据容错了,而是故意而为之 答: 后台返回null的条目有些情况并不是故意为之的,而是后台自身问题在本不应该返null的时候还是返回了null, 我前段时间的真实例子: 报表有个趋势折线图Y轴应该返回float数组的,结果后台返了[null,null,8.5,3.2]这样的数据 ,对于接收方而言是不想要null的, 和例子{ "age" : null }本质上是一样的 ,都是后台导致的问题

问题2、强行把 null 剔除掉, 自定义 List 类型,可以继承 ArrayList,重写 add 方法,如果不为空则不去调用 super.add 方法 答: 实践可以通过自定义控制是否要保留null, 但当null时,自己不能控制设置成add("")或者add(0)这样的,还是回到了问题1,问下这个应该怎么优化

class TempArraylist<T> : ArrayList<T>() {
    override fun add(element: T): Boolean {
        if (element != null) {
            super.add(element)
        }
        return true
    }
}
getActivity commented 9 months ago

小伙子,自己不能控制设置成add("")或者add(0)这样的,还是回到了问题1,问下这个应该怎么优化,我听不太懂你这句话的意思

zzl313703419 commented 9 months ago

就是如果服务器返回的[null,null,8.5,3.2] , 我想容错成[0.0,0.0,8.5,3.2], 目前框架返回的是[null,null,8.5,3.2], 调用会空指针 本来的优化想法是

D4C42233-9551-49FF-BE29-4FD63CFEF00E
wkbin commented 9 months ago

就是如果服务器返回的[null,null,8.5,3.2] , 我想容错成[0.0,0.0,8.5,3.2], 目前框架返回的是[null,null,8.5,3.2], 调用会空指针 本来的优化想法是 D4C42233-9551-49FF-BE29-4FD63CFEF00E

你可能需要这样:

class TempArrayList<T>:ArrayList<T?>(){
    override fun add(element: T?): Boolean {
        return when{
            element is String && element.isNullOrEmpty() -> add("" as T)
            element is Float && element == null -> add(0.0 as T)
            else -> super.add(element)
        }
    }
}
zzl313703419 commented 9 months ago

就是如果服务器返回的[null,null,8.5,3.2] , 我想容错成[0.0,0.0,8.5,3.2], 目前框架返回的是[null,null,8.5,3.2], 调用会空指针 本来的优化想法是 D4C42233-9551-49FF-BE29-4FD63CFEF00E

你可能需要这样: class TempArrayList<T>:ArrayList<T?>(){ override fun add(element: T?): Boolean { return when{ element is String && element.isNullOrEmpty() -> add("" as T) element is Float && element == null -> add(0.0 as T) else -> super.add(element) } } }

可以 感谢~

zzl313703419 commented 9 months ago

历时两个月 辛苦了 多谢解答