jackjson自定义序列化和反序列化

这篇具有很好参考价值的文章主要介绍了jackjson自定义序列化和反序列化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JRT引用的jackjson作为json处理库。由于JRT.ORM要求表不用datetime类型,把日期和时间用Int存储,所以ORM要支持日期时间的转换。为什么要把日期时间不用datetime而用Int,比如日期:20240117,时间就是从0点到当前的秒数。因为不用datetime兼容性好,不会因为不同库datetime函数不同而要处理差异。用Int查询效率高。

所以需要json序列化到实体时候能把日期和时间串序列化成整数。实体转json时候要能把日期和时间的整数转换成日期和时间串。

日期反序列化

package JRT.Core.JsonAttributes;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;

import java.io.IOException;

/**
 * 把JSON串转换对象,在日期属性上加上下面注解
 * @JsonSerialize(using = JRTDateSerializer.class)
 * @JsonDeserialize(using = JRTDateDeserializer.class)
 */
public class JRTDateDeserializer extends JsonDeserializer<Integer> {
    @Override
    public Integer deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        JsonNode node = jsonParser.getCodec().readTree(jsonParser);
        String val = node.asText();
        return JRT.Core.Util.TimeParser.TransDate(val);
    }
}

日期序列化

package JRT.Core.JsonAttributes;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;

/**
 * 把对象转换成JSON串,在日期属性上加上下面注解
 * @JsonSerialize(using = JRTDateSerializer.class)
 * @JsonDeserialize(using = JRTDateDeserializer.class)
 */
public class JRTDateSerializer extends JsonSerializer<Integer> {
    @Override
    public void serialize(Integer dateInt, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeString(JRT.Core.Util.TimeParser.DateIntToStr(dateInt));
    }
}

时间反序列化

package JRT.Core.JsonAttributes;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;

import java.io.IOException;
/**
 * 把JSON串转换对象,在时间属性上加上下面注解
 * @JsonSerialize(using = JRTDateSerializer.class)
 * @JsonDeserialize(using = JRTDateDeserializer.class)
 */
public class JRTTimeDeserializer extends JsonDeserializer<Integer> {
    @Override
    public Integer deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        JsonNode node = jsonParser.getCodec().readTree(jsonParser);
        String val = node.asText();
        return JRT.Core.Util.TimeParser.TransTime(val);
    }
}

时间序列化

package JRT.Core.JsonAttributes;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;

/**
 * 把对象转换成JSON串,在时间属性上加上下面注解
 * @JsonSerialize(using = JRTDateSerializer.class)
 * @JsonDeserialize(using = JRTDateDeserializer.class)
 */
public class JRTTimeSerializer extends JsonSerializer<Integer> {
    @Override
    public void serialize(Integer timeStr, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeString(JRT.Core.Util.TimeParser.TimeIntToStr(timeStr));
    }
}

布尔反序列化

package JRT.Core.JsonAttributes;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;

import java.io.IOException;

/**
 * 把JSON串转换对象,在布尔属性上加上下面注解
 * @JsonDeserialize(using = JRTBoolDeserializer.class)
 */
public class JRTBoolDeserializer extends JsonDeserializer<Boolean> {
    @Override
    public Boolean deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        JsonNode node = jsonParser.getCodec().readTree(jsonParser);
        if(node.isBoolean())
        {
            Boolean val=node.asBoolean();
            return val;
        }
        else if(node.isInt())
        {
            int val=node.asInt();
            if(val==0)
            {
                return false;
            }
            else {
                return true;
            }
        }
        else
        {
            String val = node.asText();
            if(val.equals("0"))
            {
                return false;
            }
            else if(val.equals("1"))
            {
                return true;
            }
            else if(val.equals("false"))
            {
                return false;
            }
            else if(val.equals("true"))
            {
                return true;
            }
            return false;
        }

    }
}

使用方式就是给实体属性加上注解
jackjson自定义序列化和反序列化,python,java,前端

由于ORM自己组json时候也需要知道哪些列是日期列,哪些是时间列,哪些是布尔列,所以自己实现了几个注解,这里不用jackjson的注解来判断日期时间就是为了可能变json库做预留,自己可控注解更合适

日期注解

//特性,为通用码表提供支持
package JRT.Core.CustomAttributes;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 标识属性是日期的特性
 */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface DateAttribute {
}

时间注解

//特性,为通用码表提供支持
package JRT.Core.CustomAttributes;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 标识属性是时间的特性
 */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface TimeAttribute {
}

布尔注解

//特性,为通用码表提供支持
package JRT.Core.CustomAttributes;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 标识属性是布尔的特性
 */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface BoolAttribute {
}

码表按注解解析参数
jackjson自定义序列化和反序列化,python,java,前端

ORM组json按注解处理日期和时间
jackjson自定义序列化和反序列化,python,java,前端
对象转json测试
jackjson自定义序列化和反序列化,python,java,前端

jackjson自定义序列化和反序列化,python,java,前端
打磨设计器
jackjson自定义序列化和反序列化,python,java,前端

模板表实体

package JRT.Model.Entity;
import JRT.Core.CustomAttributes.*;
import JRT.Core.JsonAttributes.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
/**
 *[功能描述:本代码由LIS内部代码生成工具生成,请不要手动修改,如要修改,请写修改变更记录]
 *[创建者:JRT.Entity生成器]
 */
@UniqueAttribute(ColNames = "RowID")
@TableAttribute(Name="dbo.JRT_PrintTemplate")
public class JRTPrintTemplate
{
	/**
	 * 主键
	 */
	@NotNullAttribute
	@IdAttribute(Name = "RowID")
	@LengthAttribute(MaxLen = 10)
	public int RowID;

	/**
	 * 模板代码
	 */
	@NotNullAttribute
	@LengthAttribute(MaxLen = 100)
	public String Code;

	/**
	 * 模板名称
	 */
	@NotNullAttribute
	@LengthAttribute(MaxLen = 100)
	public String CName;

	/**
	 * 产品组唯一标识
	 */
	@NotNullAttribute
	@LengthAttribute(MaxLen = 30)
	public String ProductGroup;

	/**
	 * 产品组存的业务ID
	 */
	@NotNullAttribute
	@LengthAttribute(MaxLen = 30)
	public String ProductBllID;

	/**
	 * 模板纸张
	 */
	@FrekeyAttribute(Name = "JRTPrintPaper", RefColumnName = "RowID", AssociaField = "CName")
	@LengthAttribute(MaxLen = 10)
	public Integer JRTPrintPaperDR;

	/**
	 * 边距
	 */
	@LengthAttribute(MaxLen = 10)
	public Double ResultLineSpacing;

	/**
	 * 结果行数
	 */
	@LengthAttribute(MaxLen = 10)
	public Integer ResultRows;

	/**
	 * 结果列
	 */
	@LengthAttribute(MaxLen = 10)
	public Integer ResultCols;

	/**
	 * 纸张方向
	 */
	@LengthAttribute(MaxLen = 10)
	public String PaperLayout;

	/**
	 * 下边距
	 */
	@LengthAttribute(MaxLen = 10)
	public Double PaperBottom;

	/**
	 * 左边距
	 */
	@LengthAttribute(MaxLen = 10)
	public Double PaperLeft;

	/**
	 * 右边距
	 */
	@LengthAttribute(MaxLen = 10)
	public Double PaperRight;

	/**
	 * 上边距
	 */
	@LengthAttribute(MaxLen = 10)
	public Double PaperTop;

	/**
	 * 微生物边距
	 */
	@LengthAttribute(MaxLen = 10)
	public Double MicResultLineSpacing;

	/**
	 * 微生物行数
	 */
	@LengthAttribute(MaxLen = 10)
	public Integer MicResultRows;

	/**
	 * 微生物列数
	 */
	@LengthAttribute(MaxLen = 10)
	public Integer MicResultCols;

	/**
	 * 边距
	 */
	@LengthAttribute(MaxLen = 10)
	public Double ArchivesMargin;

	/**
	 * 双列填充类型
	 */
	@LengthAttribute(MaxLen = 10)
	public String DoubleColFillType;

	/**
	 * 序号
	 */
	@LengthAttribute(MaxLen = 10)
	public Integer Sequence;

	/**
	 * 父模板
	 */
	@FrekeyAttribute(Name = "JRTPrintTemplate", RefColumnName = "RowID", AssociaField = "CName")
	@LengthAttribute(MaxLen = 10)
	public Integer ParentTemplateDR;

	/**
	 * 截止日期
	 */
	@JsonSerialize(using = JRTDateSerializer.class)
	@JsonDeserialize(using = JRTDateDeserializer.class)
	@DateAttribute
	@LengthAttribute(MaxLen = 10)
	public Integer EndDate;

	/**
	 * 截止时间
	 */
	@JsonSerialize(using = JRTTimeSerializer.class)
	@JsonDeserialize(using = JRTTimeDeserializer.class)
	@TimeAttribute
	@LengthAttribute(MaxLen = 10)
	public Integer EndTime;

	/**
	 * 截止说明
	 */
	@LengthAttribute(MaxLen = 50)
	public String EndRemark;

}

JRT的完善持续推进中,抽取任何空余时间来打磨文章来源地址https://www.toymoban.com/news/detail-801951.html

到了这里,关于jackjson自定义序列化和反序列化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java中序列化和反序列化解释

    在Java中,序列化(Serialization)是指将对象的状态转换为字节流的过程,以便将其保存到文件、在网络中传输或持久化到数据库中。而反序列化(Deserialization)则是将字节流转换回对象的过程,恢复对象的状态。 序列化和反序列化主要用于以下场景: 1. 对象持久化:通过序列

    2024年02月07日
    浏览(56)
  • 【精选】PHP&java 序列化和反序列化漏洞

    目录 首先 其次 技巧和方法

    2024年01月23日
    浏览(51)
  • 一文了解Java序列化和反序列化:对象的存储与传输

    Java序列化是一项强大而重要的技术,它允许我们将对象转换为字节流,以便在存储、传输和重建时使用。在本文中,我们将深入探讨Java序列化的基本概念、使用方法以及一些应用场景。 Java序列化是指将对象转换为字节流的过程,以便可以将其存储到文件、数据库或在网络上

    2024年02月13日
    浏览(35)
  • 又一个难题:Java 序列化和反序列化为什么要实现 Serializable 接口?

    作者:椰子Tyshawn 来源:https://blog.csdn.net/litianxiang_kaola 最近公司的在做服务化, 需要把所有model包里的类都实现Serializable接口, 同时还要显示指定serialVersionUID的值. 听到这个需求, 我脑海里就突然出现了好几个问题, 比如说: 序列化和反序列化是什么? 实现序列化和反序列化为什

    2024年02月08日
    浏览(51)
  • Unity-序列化和反序列化

    序列化是指把对象转换为字节序列的过程,而反序列化是指把字节序列恢复为对象的过程。序列化最主要的用途就是传递对象和保存对象。 在Unity中保存和加载、prefab、scene、Inspector窗口、实例化预制体等都使用了序列化与反序列化。 1 自定义的具有Serializable特性的非抽象、

    2024年01月24日
    浏览(56)
  • 【Linux】序列化和反序列化

    在网络编程中,直接使用 结构体 进行数据传输会出错,因为 本质上socket无法传输结构体 ,我们只有将结构体装换为字节数组,或者是字符串格式来传输,然后对端主机收到了数据,再将其转化为结构体,这就是序列化和反序列化的过程! 序列化 (Serialization)是将对象的状态

    2024年02月10日
    浏览(42)
  • 什么是序列化和反序列化?

    JSON(JavaScript Object Notation)和XML(eXtensible Markup Language)是两种常用的数据交换格式,用于在不同系统之间传输和存储数据。 JSON是一种轻量级的数据交换格式,它使用易于理解的键值对的形式表示数据。JSON数据结构简单明了,易于读写和解析,是基于JavaScript的一种常用数据

    2024年02月09日
    浏览(57)
  • [计算机网络]---序列化和反序列化

    前言 作者 :小蜗牛向前冲 名言 :我可以接受失败,但我不能接受放弃    如果觉的博主的文章还不错的话,还请 点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正  目录  一、再谈协议 二、序列化和反序化 1、网络版本计算器的场景搭建 2、

    2024年02月20日
    浏览(42)
  • TCP定制协议,序列化和反序列化

    目录 前言 1.理解协议 2.网络版本计算器 2.1设计思路 2.2接口设计 2.3代码实现: 2.4编译测试 总结         在之前的文章中,我们说TCP是面向字节流的,但是可能对于面向字节流这个概念,其实并不理解的,今天我们要介绍的是如何理解TCP是面向字节流的,通过编码的方式,自

    2024年02月12日
    浏览(33)
  • 从浅入深理解序列化和反序列化

    什么是java序列化 序列化:把对象转换为字节序列的过程 反序列:把字节序列恢复为对象的过程 对象序列化机制(object serialization)是java语言内建的一种对象持久化方式,通过对象序列化,可以将对象的状态信息保存为字节数组,并且可以在有需要的时候将这个字节数组通过

    2024年02月06日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包