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;
        }

    }
}

使用方式就是给实体属性加上注解
在这里插入图片描述

由于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 {
}

码表按注解解析参数
在这里插入图片描述

ORM组json按注解处理日期和时间
在这里插入图片描述
对象转json测试
在这里插入图片描述

在这里插入图片描述
打磨设计器
在这里插入图片描述

模板表实体

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的完善持续推进中,抽取任何空余时间来打磨

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java中的序列化反序列化是将对象转换为字节流以便存储或传输,并在需要时重新构造对象的过程。 要自定义序列化反序列化,需要实现`Serializable`接口。这个接口是一个标记接口,没有任何方法需要实现。只要一个类实现了`Serializable`接口,它就可以被序列化反序列化。 下面是一个示例代码,展示了如何自定义序列化反序列化一个`Person`类: ```java import java.io.*; public class Person implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; // 构造函数 public Person(String name, int age) { this.name = name; this.age = age; } // 序列化方法 private void writeObject(ObjectOutputStream out) throws IOException { out.writeObject(name); out.writeInt(age); } // 反序列化方法 private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { name = (String) in.readObject(); age = in.readInt(); } // 其他方法和属性... } ``` 在上面的示例中,`Person`类实现了`Serializable`接口,并定义了私有的`writeObject`和`readObject`方法。这些方法在进行序列化反序列化时会被调用。 当使用`ObjectOutputStream`进行序列化时,会调用`writeObject`方法,将对象的属性写入输出流。当使用`ObjectInputStream`进行反序列化时,会调用`readObject`方法,从输入流中读取属性并重新构造对象。 使用自定义序列化反序列化方法可以灵活地控制对象的序列化过程,可以选择性地保存或恢复对象的某些属性。 希望这个示例能帮助你理解如何在Java自定义序列化反序列化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小乌鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值