如何在Genson中使用@JsonConverter?

时间:2019-04-13 14:14:14

标签: java genson

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

如果我序列化为JSON并返回Java,则效果很好。但是我正在反序列化JavaScript。

JavaScript无法支持完整的64位unsigned int作为数字(我发现id的最后几位在JavaScript中被清零了),因此我需要将Long id转换为a序列化期间为字符串。

我不想转换对象中的所有Longs,因此我尝试仅将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
}

我也确实尝试将Converter传递到GensonBuilder中,但这击中了对象中的所有Long,这不是我所需要的。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

好吧,我不清楚为什么会这样,但是看起来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();