首页 > 其他分享 >实体类中嵌套Enum类型并想转换成JSON字符串时遇到的问题。

实体类中嵌套Enum类型并想转换成JSON字符串时遇到的问题。

时间:2023-06-08 21:44:13浏览次数:44  
标签:实体类 String Enum sexName private sex JSON SexEnum public

实体类中嵌套Enum类型并想转换成JSON字符串时遇到的问题。

先说明问题的产生,在自己写着玩的时候,新建了一个User类如下:

package com.ma.xdo;
import lombok.*;

import java.io.Serializable;

/**
 * @ClassName User
 * @Description TODO
 * @Author @O_o
 * @Date 2023/6/8 14:24
 * @Version 1.0
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User implements Serializable {
    private String name;
    private Integer age;
    private SexEnum sex;
}

不难看出User类中,用到了枚举类把性别规定成了两个。

下面是SexEnum类:

public enum SexEnum {
    MALE(1, "男"),
    FEMALE(2, "女");

    private Integer sex;
    private String sexName;

    public Integer getSex() {
        return sex;
    }

    public void setSex(Integer sex) {
        this.sex = sex;
    }

    public String getSexName() {
        return sexName;
    }

    public void setSexName(String sexName) {
        this.sexName = sexName;
    }

    SexEnum(Integer sex, String sexName) {
        this.sex = sex;
        this.sexName = sexName;
    }
}

这里,当我想通过工具类将其转换成json字符串并且让枚举中的 值能返回对应的文字时,出现了问题。返回的值是枚举类的 属性名 而不是对应的值

{"age":19,"name":"李四","sex":"MALE"}

(写到这里,我也不知道是否在企业开发中有这种需求。但是就当学习了一种工具的使用方法了)

于是,通过资料的查询,当前使用的环境是fastJson,fastJson提供了自定义序列化的接口ObjectSerializer,实现这个接口, 需要重写其提供的一个方法

public class SexEnumSerializer implements ObjectSerializer {
    @Override
    public void write(JSONSerializer jsonSerializer, Object o, Object o1, Type type, int i) throws IOException {
		// TODO 这里固定要自定义的转换类型就好
    }
}

由于这个接口是一个函数式接口,于是我干脆用到了lambda表达式 实现流程如下

//声明出一个配置对象
SerializeConfig config = new SerializeConfig();
//把自定义的序列化方式,当接到的这个值 包含 sexEnum这个类型属性的时候  会替换其sex中的对应值
config.put(SexEnum.class, (JSONSerializer jsonSerializer, Object o, Object o1, Type type, int i)->{
    if (o instanceof SexEnum) {
        SexEnum sexEnum = (SexEnum) o;
        jsonSerializer.write(sexEnum.getSexName());
    } else {
        jsonSerializer.write(o);
    }
});
String json = JSON.toJSONString(user, config);

由此 解决了此次遇到的问题。成功输出

{"age":19,"name":"李四","sex":"男"}

标签:实体类,String,Enum,sexName,private,sex,JSON,SexEnum,public
From: https://www.cnblogs.com/letfly/p/17467762.html

相关文章

  • Alibaba FastJSON 反序列化json时字段值未成功赋值
    FastJson是一个将对象序列化为json字符串和将字符串反序列化为对象的一个工具,但是在反序列化解析时,可能会出现字段值丢失的问题,笔者在手撸rpc框架的时候,对于客户端传过来的json字符串总是有一个字段值解析为null,在客户端解析却又是正常的,花费了很多时间去找这个bug,通过解析Jsonpa......
  • Jmeter 响应结果提取json表达式
    JSONPathexpression:JSON表达式,通过JSON表达式提取数据对响应结果提取json,下拉选择JsonPahtTester.  JSON表达式语法:"$"代表提取根节点的数据$.a代表从根节点开始,寻找根节点的子节点a,并提取a的数据$.a.b代表从根节点开始,寻找根节点的子节点a,然后寻找a的子节点b,并......
  • 关于The JSON value could not be converted to System.DateTime的解决方案
    如下json格式提交到后台后报:TheJSONvaluecouldnotbeconvertedtoSystem.DateTime.Path:$.beginTime|LineNumber:3|BytePositionInLine:33.{"beginTime":"2023-06-08T08:00:00"}造成这个错误的原因为程序无法正常解析该json,主要是为了提升执行效率;Sys......
  • JSON与JAVA数据的转换
    JSON与JAVA数据的转换关键字:jsonjavaJSON-lib这个Java类包用于把bean,map和XML转换成JSON并能够把JSON转回成bean和DynaBean。下载地址:http://json-lib.sourceforge.net/还要需要的第3方包:jakartacommons-lang2.3jakartacommons-beanutils1.7.0j......
  • 【C#】JSON转DataTable存入数据库
    由于JSON直接转DataTable可能会存在类型丢失如下:采用读取数据库表字段类型构建DataTable///<summary>///JSON转DataTale存入数据库///</summary>///<paramname="json"></param>publicstaticvoidJsonDataTableTest(stringjson){stringsql=strin......
  • .net core 因路径原因导致的JSON解析错误
    因解析json配置文件导致的错误:JsonReaderException:'0xEF'isaninvalidescapablecharacterwithinaJSONstring.Thestringshouldbecorrectlyescaped.LineNumber如何解决?{  "path":"D:\工作资料\技术资料"}改为{   "path":"D:......
  • nodejs package.json
    package.json是用来识别项目并且处理项目的依赖关系的{"name":"名",//包名字"version":"1.0.0",//版本"description":"描述","main":"index.js",//入口文件"scripts":{//指定运行脚本......
  • 微信小程序开发笔记 进阶篇⑤——getPhoneNumber 获取用户手机号码(基础库 2.21.2 之前
    文章目录一、前言二、前端代码wxml三、前端代码js四、后端java五、程序流程六、参考一、前言微信小程序开发笔记——导读大部分微信小程序开发者都会有这样的需求:获取小程序用户的手机号码。但是,因为小程序用户的手机号码属于重要信息,为了安全,所以需要如下一系列较为复杂的方法和......
  • 微信小程序开发笔记 进阶篇⑥——getPhoneNumber 获取用户手机号码(基础库 2.21.2 之后
    文章目录一、前言二、前端代码wxml三、前端代码js四、后端java五、程序流程六、参考一、前言微信小程序开发笔记——导读大部分微信小程序开发者都会有这样的需求:获取小程序用户的手机号码。但是,因为小程序用户的手机号码属于重要信息,为了安全,所以需要如下一系列较为复杂的方法和......
  • go json、yaml解码
    func GetFoo(ctx context.Context) (*T, error) {  req, err := http.NewRequest("GET", "http://foo/t.json", nil)  if err != nil {    return nil, err  }  req = req.WithContext(ctx)  res, err := http.DefaultClient.Do(req)  if e......