码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Gson解析会丢失默认属性值


    1. 问题:类的属性中有设置默认值,Gson中如果不包含该属性时,应该会使用该默认值。如下:
    class MyPointBean {
    
        inner class InnerBean {
            var altitude = 0.0
            var gradually = 1
        }
    }
        val gson = GsonBuilder().create()
        val pStr = """   {"altitude":40.0}   """.trimIndent()
        val p2 = gson.fromJson(pStr, MyPointBean.InnerBean::class.java)
        println("p2: ${p2.altitude}, ${p2.gradually}")
    

    打印输出发现 gradually 值并没有设置为1,而是0.
    p2: 40.0, 0

    1. 排查。有点怀疑Gson的问题了,然后重新创建一个简单的类来对比,发现其它类没有问题,正常的输出了 gradually: 1。
      经常各种尝试,最终发现是内部类才有这个问题。对比如下:
    class MyPointBean {
        var altitude = 0.0
        var gradually = 1;
    
    
        inner class InnerBean {
            var altitude = 0.0
            var gradually = 1
        }
    }
    
        val gson = GsonBuilder().create()
        val pStr = """   {"altitude":40.0}   """.trimIndent()
        val p = gson.fromJson(pStr, MyPointBean::class.java)
        println("p: ${p.altitude}, ${p.gradually}")
    
        val p2 = gson.fromJson(pStr, MyPointBean.InnerBean::class.java)
        println("p2: ${p2.altitude}, ${p2.gradually}")
    

    输出为:
    p: 40.0, 1
    p2: 40.0, 0

    也就是普通类的属性能保留了,但是内部类的默认值丢失了。

    1. 解决: 把内部类改为静态内部类
    • kotlin内部类就去掉inner。
    • java内部类就添加 static ,成为静态内部类。
    class MyPointBean {
        var altitude = 0.0
        var gradually = 1;
    
        class InnerBean {  // 把inner去掉
            var altitude = 0.0
            var gradually = 1
        }
    }
    

    具体原因就不懂了。可能内部类还要依赖于所在的上级类,而静态类是完全独立的,跟普通类没有什么区别。

  • 相关阅读:
    chrome插件开发入门-保姆级攻略
    快速体验Spring Boot了解使用、运行和打包 | SpringBoot 2.7.2学习系列
    Elasticsearch之索引简单应用
    XDOJ-360 结点在二叉排序树的位置
    漫谈有序读取与关系库索引
    探针配置失误,线上容器应用异常死锁后,kubernetes集群未及时响应自愈重启容器?
    (四)Windows网络模型之完成端口模型详解
    定时器方案之红黑树与最小堆、时间轮详解
    <前端>Electron-builder为公证后的app打更新信息latest.yml
    第13/100天 阅读笔记
  • 原文地址:https://blog.csdn.net/keeng2008/article/details/139421658
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号