我正在尝试使用Genson将一个具有长id的对象序列化为JSON。
如果我将其序列化为JSON,然后再序列化为Java,它会工作得很好。但我正在用JavaScript进行反序列化。
JavaScript不支持完整的64位unsigned int作为数字(我发现我的id的最后几位在JavaScript中被置零),所以我需要在序列化过程中将长id转换为字符串。
我不想转换对象中的所有Long,所以我只对id字段使用Converter。
import com.owlike.genson.annotation.JsonConverter;
import javax.persistence.Id;
import lombok.Getter;
import lombok.Setter;
...
/** the local database ID for this order */
@JsonConverter(LongToStringConverter.class)
@Id
@Setter
@Getter
private Long id;
/** The unique ID provided by the client */
@Setter
@Getter
private Long clientKey; 我的转换器代码如下所示:
public class LongToStringConverter implements Converter<Long> {
/** Default no-arg constructor required by Genson */
public LongToStringConverter() {
}
@Override
public Long deserialize(ObjectReader reader, Context ctx) {
return reader.valueAsLong();
}
@Override
public void serialize(Long obj, ObjectWriter writer, Context ctx) {
if (obj != null) {
writer.writeString(obj.toString());
}
}
}在调用序列化本身时,我没有做任何特殊的事情:
Genson genson = new GensonBuilder().useIndentation(true).create();
String json = genson.serialize( order );这不管用。输出仍然是这样的:
{
"clientKey":9923001278,
"id":1040012110000000002
}我想要实现的是:
{
"clientKey":9923001278,
"id":"1040012110000000002" // value is quoted
}我也试着将我的转换器传递给一个GensonBuilder,但它命中了对象中的所有Long,这并不是我需要的。
有什么建议吗?
发布于 2019-04-16 10:03:29
好吧,我不清楚为什么,但看起来Genson就是没有得到注释。这可能归因于Hibernate或Lombok的使用。
解决方案似乎是强制Genson考虑带注释的字段。
我通过使用GensonBuilder实现了这一点:
Genson genson = new GensonBuilder().useIndentation(true).include("id").create();
String json = genson.serialize( order );编辑:结合Eugen上面的答案,这也是可行的,因为它指示Genson查看私有字段,而不是依赖于getter/setter:
Genson genson2 = new GensonBuilder().useFields(true, VisibilityFilter.PRIVATE).useMethods(true).create();https://stackoverflow.com/questions/55666438
复制相似问题