Java 如何将@JsonConverter与Genson一起使用?
我正在尝试使用Genson将一个具有长id的对象序列化为JSON 如果我将其序列化为JSON并返回到Java中,效果会很好。但我正在用JavaScript进行反序列化 JavaScript不支持将完整的64位作为数字(我发现我的id的最后几位在JavaScript中被归零),因此我需要在序列化期间将长id转换为字符串 我不想转换对象中的所有long,所以我尝试只对id字段使用一个转换器Java 如何将@JsonConverter与Genson一起使用?,java,genson,Java,Genson,我正在尝试使用Genson将一个具有长id的对象序列化为JSON 如果我将其序列化为JSON并返回到Java中,效果会很好。但我正在用JavaScript进行反序列化 JavaScript不支持将完整的64位作为数字(我发现我的id的最后几位在JavaScript中被归零),因此我需要在序列化期间将长id转换为字符串 我不想转换对象中的所有long,所以我尝试只对id字段使用一个转换器 import com.owlike.genson.annotation.JsonConverter; impo
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());
}
}
}
{
"clientKey":9923001278,
"id":1040012110000000002
}
这不管用。输出仍然如下所示:
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());
}
}
}
{
"clientKey":9923001278,
"id":1040012110000000002
}
我试图实现的是:
{
"clientKey":9923001278,
"id":"1040012110000000002" // value is quoted
}
我也尝试将我的转换器传递到GensonBuilder中,但这会影响对象中的所有长度,这不是我所需要的
有什么建议吗 嗯,我不清楚为什么,但看起来Genson没有得到注释。这可能是由于使用了Hibernate或Lombok 解决方案似乎是强迫GeSON考虑注释字段。 我使用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();
默认情况下,Genson使用getter/setter,因此您需要在它们上定义此注释。如果您想使用类属性执行ser/de而忽略get/set,您可以使用一些东西。@eugen-非常感谢,非常适合。我已经更新了我的答案以反映这些信息。