- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,我正在为我的 POJO 类使用 Genson 的 ser/de。但是在序列化具有字节字段的 POJO 时出现问题。我没有尝试反序列化同一对象。所以我不知道这是否也有效。日期字段也有问题。
这是我的POJO
public class User implements Serializable{
private String userId;
private String emailId;
private Date lastLogin;
private Byte attempts;
//geters and setters, toString methods.
}
我得到了带有值的对象,当我打印时,我得到了如下结果。
User [userId=sss, emailId=ssss@gmail.com, lastLogin=2014-12-21 23:24:46.0, attempts=9]
我尝试使用以下代码使用 Genson 进行序列化(有时我需要通过删除一些字段来进行序列化,因此我使用了以下代码)。
public String serialize(Object object, Class cls,
String[] ignoreList) {
GensonBuilder builder = new Genson.Builder();
if (null != ignoreList) {
for (String field : ignoreList) {
builder.exclude(field, cls);
}
}
Genson genson = builder.create();
return genson.serialize(object);
}
但是我得到如下的JSON字符串,字节字段值不同。日期字段值没有时间戳。
{"emailId":"sss@gmail.com","lastLogin":"21 Dec, 2014","attempts":"CQ==","userId":"sss"}
我看到 this Issue in Github 已经解决了字节问题.但是如何在我的项目中获取更新的代码?我正在使用 Maven,并且正在使用最新版本的 Genson-1.2。
我应该在我的代码中尝试 builder.useByteAsInt(true);
吗?
也适用于日期字段。我看到两个选项
builder.useDateAsTimestamp(true);
builder.useDateFormat(dateFormat);
我不想设置这些东西。因为有时该字段可能带有时间戳,有时它没有时间戳,并且不同对象的日期格式可能不同。我正在寻找一种解决方案,它将序列化日期字段并按原样转换为字符串。
获取正确 JSON 字符串的最佳方法是什么?我正在寻找一种可以序列化反序列化任何 POJO 类的解决方案。
更新 1
我已经创建了 ByteConverter 和 Date Converter。
这些是我的转换器字节转换器.java
@HandleClassMetadata
@HandleBeanView
public final class ByteConverter implements Converter<Byte> {
public final static ByteConverter instance = new ByteConverter();
private ByteConverter() {
}
public void serialize(Byte obj, ObjectWriter writer, Context ctx) {
writer.writeValue(obj.byteValue());
}
public Byte deserialize(ObjectReader reader, Context ctx) {
return (byte) reader.valueAsInt();
}
}
DateConverter.java
@HandleClassMetadata
@HandleBeanView
public class DateConverter implements Converter<Date> {
private DateFormat dateFormat;
private final boolean asTimeInMillis;
public DateConverter() {
this(SimpleDateFormat.getDateInstance(), false);
}
public DateConverter(DateFormat dateFormat, boolean asTimeInMillis) {
if (dateFormat == null)
dateFormat = SimpleDateFormat.getDateInstance();
this.dateFormat = dateFormat;
this.asTimeInMillis = asTimeInMillis;
}
public void serialize(Date obj, ObjectWriter writer, Context ctx) {
if (asTimeInMillis)
writer.writeValue(obj.getTime());
else
writer.writeUnsafeValue(format(obj));
}
protected synchronized String format(Date date) {
return dateFormat.format(date);
}
public Date deserialize(ObjectReader reader, Context ctx) {
try {
if (asTimeInMillis)
return new Date(reader.valueAsLong());
else
return read(reader.valueAsString());
} catch (ParseException e) {
throw new JsonBindingException("Could not parse date "
+ reader.valueAsString(), e);
}
}
protected synchronized Date read(String dateString) throws ParseException {
return dateFormat.parse(dateString);
}
}
在我的方法中,我尝试了以下代码
public void serialize(User user) {
Converter<Byte> byteConverter = ByteConverter.instance;
Converter<Date> dateConverter = new DateConverter();
Converter[] converters = { byteConverter, dateConverter };
GensonBuilder builder = new GensonBuilder();
builder.withConverters(converters);
Genson genson = builder.create();
String str = genson.serialize(user);
System.out.println(str);
}
我得到以下 JSON 字符串
{"emailId":"sss@gmail.com","lastLogin":"21 Dec, 2014","attempts":"9","userId":"sss"}
字节问题解决了。但是日期问题仍然存在。我尝试使用 DateConverter 类的 derialize 方法。但它也没有用。
public Date deserialize(ObjectReader reader, Context ctx) {
try {
if (reader.getValueType() == ValueType.INTEGER)
return new Date(reader.valueAsLong());
else
return dateFormat.parse(reader.valueAsString());
} catch (ParseException e) {
throw new JsonBindingException("Could not parse date "
+ reader.valueAsString(), e);
}
}
更新 2
我更新的 DateConverter.java。 DateUtils 来自 Apache commons。我还没有测试反序列化。但是序列化正在工作。我也想要带时区的格式。所以我以我定制的方式做了。
@HandleClassMetadata
@HandleBeanView
public class DateConverter implements Converter<Date> {
private static final String YYYY_MM_DD_HH_MM_SS_Z = "yyyy-MM-dd HH:mm:ss z";
private static final String YYYY_MM_DD_SLASH = "yyyy/MM/dd";
private static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
private static final String YYYY_MM_DD_HH_MM_SS_ZZZ = "yyyy-MM-dd HH:mm:ss zzz";
private static final String DD_MMM_YY_HH_MM_SS_SSSSSS_AAA = "dd-MMM-yy hh.mm.ss.SSSSSS aaa";
private static final String YYYY_MM_DD_HH_MM_SS_SSS = "yyyy-MM-dd HH:mm:ss.SSS";
private static final String YYYY_MM_DD = "yyyy-MM-dd";
private static final String YYYY_MM_DD_HH_MM_SS_0 = "yyyy-MM-dd HH:mm:ss.'0'";
private static final String EEE_MMM_DD_HH_MM_SS_ZZZ_YYYY = "EEE MMM dd HH:mm:ss zzz yyyy";
String[] dateFormats = { EEE_MMM_DD_HH_MM_SS_ZZZ_YYYY,
YYYY_MM_DD_HH_MM_SS_0, YYYY_MM_DD, YYYY_MM_DD_HH_MM_SS_SSS,
DD_MMM_YY_HH_MM_SS_SSSSSS_AAA, YYYY_MM_DD_HH_MM_SS_ZZZ,
YYYY_MM_DD_HH_MM_SS, YYYY_MM_DD_SLASH };
private DateFormat dateFormat;
private final boolean asTimeInMillis;
public DateConverter() {
this(SimpleDateFormat.getDateInstance(), false);
}
public DateConverter(DateFormat dateFormat, boolean asTimeInMillis) {
if (dateFormat == null)
dateFormat = SimpleDateFormat.getDateInstance();
this.dateFormat = dateFormat;
this.asTimeInMillis = asTimeInMillis;
}
public void serialize(Date obj, ObjectWriter writer, Context ctx) {
if (asTimeInMillis)
writer.writeValue(obj.getTime());
else
writer.writeUnsafeValue(format(obj));
}
protected synchronized String format(Date date) {
return getDateTime(YYYY_MM_DD_HH_MM_SS_Z, date);
// return dateFormat.format(date);
}
public Date deserialize(ObjectReader reader, Context ctx) {
try {
if (asTimeInMillis)
return new Date(reader.valueAsLong());
else
return read(reader.valueAsString());
} catch (ParseException e) {
throw new JsonBindingException("Could not parse date "
+ reader.valueAsString(), e);
}
}
protected synchronized Date read(String dateString) throws ParseException {
return DateUtils.parseDate(dateString, dateFormats);
// return dateFormat.parse(dateString);
}
public String getDateTime(String aMask, Date aDate) {
SimpleDateFormat df = null;
String returnValue = "";
if (aDate != null) {
df = new SimpleDateFormat(aMask);
returnValue = df.format(aDate);
}
return returnValue;
}
}
最佳答案
更新这已在 Genson 1.3 中发布。
单字节问题
您提到的问题的修复已推送到开发分支但尚未发布。它应该很快就会与其他增强功能和错误修复一起出现。如果您现在需要它,那么您可以 define a custom Converter并使用 GensonBuilder 进行注册。
请注意,只有在启用类元数据功能时才需要添加@HandleClassMetadata 注释(此注释可确保 Genson 不会为此转换器的输出写入类信息)。
日期格式
如果每个字段的传入日期格式(字符串或时间戳)没有改变,那么您可以定义全局策略,然后在您的 getter 和 setter(如果您使用默认配置)或字段(如果您不'使用 getter/setter 和配置的私有(private)字段可见性)。
如果传入数据即使对于同一字段也发生变化(或者您不想使用注释),您可能必须提供类似于 this one 的自定义日期转换器.主要区别在于,在反序列化方法中,您将拥有如下内容:
if (reader.getValueType() == ValueType.INTEGER)
return new Date(reader.valueAsLong());
else if (reader.getValueType() == ValueType.STRING)
return dateFormat.parse(reader.valueAsString());
我打开了an issue在下一个版本中开箱即用。
关于java - 字节和日期字段的 Genson 序列化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28104254/
我正在阅读 Python 文档以真正深入了解 Python 语言,并遇到了 filter 和 map 函数。我以前使用过过滤器,但从未使用过映射,尽管我在 SO 上的各种 Python 问题中都见过这
当我尝试打印 BST 的级别顺序时,这个问题提示了我。 这是一个 Pre-Order Sequence: 4, 1, 2, 3, 5, 6, 7, 8 In_order Sequence : 1, 2
我的代码在 main(序列测试;)的第一行出现错误,指出它是对 sequence::sequence() 的 undefined reference 。我无法更改 main 中的代码。有谁知道我该如何
这可能很简单,但我在通常的 latex 指南中找不到任何相关内容。在这句话中: {\em hello\/} “\/”的目的是什么? 最佳答案 这就是所谓的斜体校正。其目的是确保斜体文本后有适当的间距。
当我从 Postgresql 表中删除所有记录,然后尝试重置序列以在插入时开始一个编号为 1 的新记录时,我得到不同的结果: SELECT setval('tblname_id_seq', (SELE
在版本10.0.3中,MariaDB引入了一种称为序列的存储引擎。 其ad hoc为操作生成整数序列,然后终止。 该序列包含正整数,以降序或升序排列,并使用起始,结束和递增值。 它不允许在多个查询中
如何在 Groovy 中获取给定数字的序列,例如: def number = 169 // need a method in groovy to find the consecutive number
基本上,如果这是 .NET,它看起来像这样: ISomething { string A { get; } int B { get; } } var somethings = new List
说以下代码部分(同一块): A <= 1 A <= 2 变量 A 总是被赋值为 2 吗?还是会出现竞争条件并分配 1 或 2? 我对非阻塞赋值的理解是,由硬件在 future 分配变量 A,因此它可能
在运行 WiX 设置时,我正在寻找操作列表及其顺序。不知何故,官方网站似乎没有提供任何信息。 基本问题是我想正确安排我的自定义操作。通常我需要使用 regsvr32.exe 注册一个 DLL,而这只能
F#初学者在这里 我想创建一个类型,它是具有至少一个元素的另一种具体类型(事件)的序列。任何其他元素都可以在以后随时添加。通常在 C# 中,我会创建一个具有私有(private) List 和公共(p
作为构建过程和不断发展的数据库的一部分,我试图创建一个脚本,该脚本将删除用户的所有表和序列。我不想重新创建用户,因为这将需要比所允许的更多的权限。 我的脚本创建了一个过程来删除表/序列,执行该过程,然
我想恢复两个向量的第一个日期和相同向量的第二个日期之间的日期序列,.... 这是一个例子: dates1 = as.Date(c('2015-10-01', '2015-03-27', '2015-0
这个问题已经有答案了: sql ORDER BY multiple values in specific order? (12 个回答) 已关闭 9 年前。 我有一个 sql 语句,我想要ORDER
我想恢复两个向量的第一个日期和相同向量的第二个日期之间的日期序列,.... 这是一个例子: dates1 = as.Date(c('2015-10-01', '2015-03-27', '2015-0
在用java编写代码时,我需要用“],[”分割字符串。下面是我的代码。 try (BufferedReader reader = new BufferedReader(new InputStreamR
这个问题已经有答案了: Project Euler Question 14 (Collatz Problem) (8 个回答) 已关闭 9 年前。 我正在尝试查找数字的 Collatz 序列。以下
我有一个例程函数process_letter_location(const char& c, string &word)。 在我的 main 中,我声明了一系列字符串变量,如下所示: string s
我需要找到最长的多米诺骨牌链,给定一组 12 个随机挑选的多米诺骨牌。我已经递归地生成了多米诺骨牌的所有可能性(使用 0 到 12 的面值有 91 种可能性)。多米诺骨牌由一 block “砖 blo
我有这个数据结构 Seq,它继承了类 vector 但有一些额外的功能。使用这个数据结构 Seq 我有这个预定义的数据结构: typedef Seq > MxInt2d; 我现在想要一个包含多个 Mx
我是一名优秀的程序员,十分优秀!