Java 如何将@JsonConverter与Genson一起使用?

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

我正在尝试使用Genson将一个具有长id的对象序列化为JSON

如果我将其序列化为JSON并返回到Java中,效果会很好。但我正在用JavaScript进行反序列化

JavaScript不支持将完整的64位作为数字(我发现我的id的最后几位在JavaScript中被归零),因此我需要在序列化期间将长id转换为字符串

我不想转换对象中的所有long,所以我尝试只对id字段使用一个转换器

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-非常感谢,非常适合。我已经更新了我的答案以反映这些信息。