社区首页 >问答首页 >Gson -如何进行特殊处理,如屏蔽

Gson -如何进行特殊处理,如屏蔽
EN

Stack Overflow用户
提问于 2021-04-21 01:18:02
回答 1查看 52关注 0票数 1

如何配置Gson对toJson的值进行额外的处理?

代码语言:javascript
代码运行次数:0
复制
public class MyClass{
    @SerializedName("qwerty")
    @Mask(exposeFront=2, exposeRear=2, mask="*")
    private String qwerty
}

假设MyClass#qwerty的值为1234567890,如何将Gson设置为输出{"qwerty":"12******90"}

EN

回答 1

Stack Overflow用户

发布于 2021-04-21 02:18:34

负责“普通”对象序列化和反序列化的@Masked ReflectiveTypeAdapterFactory无法增强以支持任何其他注释,如Gson。它只能使用@Expose (间接通过排除策略)、@SerializedName和其他一些注释,如@Since@Until (也可以使用排除策略)。注意:默认情况下,文档中记录并支持这些注释。一般来说,Gson建议对声明类使用类型适配器MyClass,但这也意味着您必须管理所有字段,并确保在类更改后更新相应的类型适配器。更糟糕的是,添加自定义类型适配器会使这些批注的支持丢失。

另一种解决方法是注入一个特殊的字符串类型适配器工厂,该工厂可以做到这一点,但由于它的注入机制,这是有限的,并且需要复制@Masked注释值(如果您在代码中的其他地方使用该注释)和@JsonAdapter中的类型适配器工厂配置。

代码语言:javascript
代码运行次数:0
复制
public abstract class MaskedTypeAdapterFactory
        implements TypeAdapterFactory {

    private final int exposeFront;
    private final int exposeRear;
    private final char mask;

    private MaskedTypeAdapterFactory(final int exposeFront, final int exposeRear, final char mask) {
        this.exposeFront = exposeFront;
        this.exposeRear = exposeRear;
        this.mask = mask;
    }

    // must be "baked" into the class (name only represents the configuration)
    public static final class _2_2_asterisk
            extends MaskedTypeAdapterFactory {

        private _2_2_asterisk() {
            super(2, 2, '*');
        }

    }

    @Override
    @Nullable
    public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> typeToken) {
        if ( typeToken.getRawType() != String.class ) {
            return null;
        }
        @SuppressWarnings("unchecked")
        final TypeAdapter<String> delegate = (TypeAdapter<String>) gson.getAdapter(typeToken);
        final TypeAdapter<String> typeAdapter = new TypeAdapter<String>() {
            @Override
            public void write(final JsonWriter out, final String value)
                    throws IOException {
                // mask the value
                final int length = value.length();
                final char[] buffer = value.toCharArray();
                for ( int i = exposeFront; i < length - exposeRear; i++ ) {
                    buffer[i] = mask;
                }
                out.value(new String(buffer));
            }

            @Override
            public String read(final JsonReader in)
                    throws IOException {
                return delegate.read(in);
            }
        }
                .nullSafe();
        @SuppressWarnings("unchecked")
        final TypeAdapter<T> adapter = (TypeAdapter<T>) typeAdapter;
        return adapter;
    }

}
代码语言:javascript
代码运行次数:0
复制
@NoArgsConstructor
@AllArgsConstructor
final class MyClass {

    @SerializedName("qwerty")
    @Mask(exposeFront = 2, exposeRear = 2, mask = "*")
    // unfortunately, this must duplicate the @Mask annotation values
    // since type adapter (factories) do not accept supplemental information
    // and Java annotations can only accept compile-time constants
    @JsonAdapter(MaskedTypeAdapterFactory._2_2_asterisk.class)
    @SuppressWarnings("unused")
    private String qwerty;

}

测试:

代码语言:javascript
代码运行次数:0
复制
public final class MaskedTypeAdapterFactoryTest {

    private static final Gson gson = new GsonBuilder()
            .disableHtmlEscaping()
            .disableInnerClassSerialization()
            .create();

    @Test
    public void test() {
        final String actual = gson.toJson(new MyClass("1234567890"));
        final String expected = "{\"qwerty\":\"12******90\"}";
        Assertions.assertEquals(expected, actual);
    }

}

在Gson中,这可能是最健壮的方式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67188120

复制
相关文章
带有-i选项的sed命令在Linux上执行成功,但在MacOS上失败
就地编辑文件(如果提供了后缀,则进行备份),可见参数后缀 SUFFIX 是可选的,即带或者不带这个参数都可以执行。
程序熵
2023/09/25
3540
带有-i选项的sed命令在Linux上执行成功,但在MacOS上失败
如何通过Emond在macOS上实现持久化访问
在这篇文章中,我们会介绍如何通过emond在macOS上实现持久化访问。根据苹果公司的说法,事件监视进程(emond)会“接受来自各种服务的事件,通过一个简单的规则引擎运行并采取相应操作(action),这些操作可以是执行命令,发送电子邮件或者短消息,推送通知等”。听起来挺有意思,实际上Emond自OS X 10.7就已经有了,所以本文所讨论的细节适用于最新版本的macOS(10.13.2)。 具体步骤 emond是一个普通的守护进程,每次系统启动时都会由launchd执行,其对于launchd的配置文件和
FB客服
2018/02/23
2.3K0
如何通过Emond在macOS上实现持久化访问
如何利用Calendar Alerts在macOS上实现持久化
在这篇文章中,我们将介绍如何利用Calendar Alerts在macOS上实现持久化,并深入讨论如何在渗透测试行动中使用这项技术。其中包括如何对Automator.app进行逆向工程分析以找到一个未记录的API来启用该技术。除此之外,我们还会提供一个针对Aotumation(JXA)代码的JavaScript来实现持久化攻击。
FB客服
2020/11/06
1.1K0
如何利用Calendar Alerts在macOS上实现持久化
在MacOs上用Docker开发
该文章介绍如何使用Docker在Mac上构建和运行Node.js应用程序。首先,介绍了Docker的基本概念和优势,然后详细说明了在Mac上使用Docker的开发流程。包括拉取Docker镜像、运行容器、管理容器和容器路径等。最后,探讨了Docker在软件开发和部署中的重要性,以及Docker在Mac上的实际应用场景。
花落花飞去
2017/12/27
4.1K0
在macOS上安装&配置PostgreSQL
Homebrew以及dmg安装包安装都可以,不过Homebrew跟dmg包图形化安装还是有些区别,根据自己习惯任选其一即可,不过为了方便理解后续的操作,还是简单介绍下两种安装方式的区别
KenTalk
2023/04/07
12.7K0
在macOS上安装&配置PostgreSQL
在 MacOS 上读取 Btrfs 分区文件
Btrfs 文件系统相较于 Ext4 ,是一种更年轻的文件系统,具有更多可玩的特征,比如支持快照、子卷、校验和自检、软 RAID 甚至透明压缩等。
陈少文
2021/12/22
4.6K0
在 MacOS 上通过 Lima 使用 Docker
目前在 macOS 上如果想使用 docker,那么最直接的就是使用 官方推出的 docker-desktop[1]
我的小碗汤
2023/03/19
2.5K0
在 MacOS 上通过 Lima 使用 Docker
macOS: 安装卷宗失败
如果插上希捷移动硬盘后,mac右上角还是显示“安装卷宗失败”,则进入系统偏好设置 -> 安全性与隐私:
JNingWei
2018/09/27
3.5K0
macOS: 安装卷宗失败
在macOS 10.12 上编译 Android 5.1
官方文档虽然也有介绍,但是macOS平台上的编译环境问题还存在很多坑。本文介绍下如何在在macOS 10.12 上编译 Android 5.1源码,导入源码到Android Studio中,把系统烧录到Nexus6手机中。 ---- 搭建编译环境 创建分区 AOSP源码需要一个支持大小写敏感的文件系统,100G是至少要的。官网有详细的介绍,这里简单列一下。 $ hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g
felix
2018/06/08
1.9K0
LWN: 在 Linux 上运行 macOS 程序
目前有个名叫Darling的项目活跃度不断提升,这个项目是希望能在Linux上提供一个针对macOS软件的translation layer(翻译层),有点类似Wine这个项目所做的工作。Darling比起Wine来说,成熟度差得尚远,因此开发者们现在仍在尽力能增加更多功能,使得此项目在今后的某一天能够对更多用户提供帮助。
用户6543014
2019/10/25
6.4K0
LWN: 在 Linux 上运行 macOS 程序
在MacOS上安装配置Mongodb
MongoDB 去年 10 月份宣布将开源 License 从 GNU AGPLv3 切换到 Server Side Public License(SSPL),之后遭到了来自开源社区的抵制。
雪梦科技
2020/05/11
1.7K0
在macOS10.12系统上给thea
首先查了一下,cuda只支持Nvida显卡,所以只好放弃了。转而选择gpuarray backend,这个版本还没有release,都是开发版。
py3study
2020/01/02
6670
在MacOS上源码安装OpenCV-4.0.0
OpenCV-4.0.0已经放出来一阵日子了,很有新功能新特性值得尝试,由于MacOS上的brewhome包中编译好的OpenCV版本只有3.4.3,为了在MacOS上安装最新的OpenCV,只好走源码编译这条路了。
老潘
2023/10/19
4020
在MacOS上源码安装OpenCV-4.0.0
在ESXi上安装macos虚拟机
再一想,是AIX什么时候可以运行在ESXi上?也许永远没有机会了,毕竟已经进入云计算大数据时代了。
boypoo
2020/02/14
8.2K1
用 pyenv 在 MacOS 上创建虚拟环境
创建名为 my-310-python 的虚拟目录,并且其中加载 Python 3.10.0 。
老齐
2022/03/31
1.2K0
最新版MySQL在MacOS上的安装与使用!
我们本文将采用最常规的方式,也就是安装包的方式进行安装,这也是我推荐给新手的安装方式,因为这种安装方式更直观更可控一些,比如对 MySQL 版本的选择和密码配置等,那接下来我们就直接开始吧。
磊哥
2020/10/27
2K0
最新版MySQL在MacOS上的安装与使用!
在macOS上安装配置golang开发环境
通过编辑器打开 .bashrc 或者 .zshrc,将以下配置贴到文件最后,并保存。
雪梦科技
2020/05/11
1.5K0
踩坑 | 在 macOS 上使用 Docker Desktop 启动 Kubernetes
点击 Docker 图标,选择 Preferences… > Kubernetes 进入 Kubernetes 配置页:
江不知
2019/12/12
5.2K0
踩坑 | 在 macOS 上使用 Docker Desktop 启动 Kubernetes
macOS 上编译 Dynamips
如果发生错误,可以尝试指定 C 编译器的路径,可用 xcrun 命令找到相应的编译器的路径:
饶文津
2020/06/02
6360
卡夫卡入门
1.Kafka独特设计在什么地方? 2.Kafka如何搭建及创建topic、发送消息、消费消息? 3.如何书写Kafka程序? 4.数据传输的事务定义有哪三种? 5.Kafka判断一个节点是否活着有哪两个条件? 6.producer是否直接将数据发送到broker的leader(主节点)? 7.Kafa consumer是否可以消费指定分区消息? 8.Kafka消息是采用Pull模式,还是Push模式? 9.Procuder API有哪两种? 10.Kafka存储在硬盘上的消息格式是什么? 一、基本概念 介绍 Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。 这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统术语: Kafka将消息以topic为单位进行归纳。 将向Kafka topic发布消息的程序成为producers. 将预订topics并消费消息的程序成为consumer. Kafka以集群的方式运行,可以由一个或多个服务组成,每个服务叫做一个broker. producers通过网络将消息发送到Kafka集群,集群向消费者提供消息,如下图所示: <ignore_js_op>
步履不停凡
2019/09/11
8380
卡夫卡入门

相似问题

glewInit()在macOS上失败

11

NSUbiquitousKeyValueStore在macOS Sierra上的失败

14

在macos上安装Brew失败

137

在MacOS上安装pycosat失败

14

Kextload在macOS Sierra上失败。( FTDIUSBSerialDriver加载失败)

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文