我正在尝试使用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,这不是我所需要的。
有什么建议吗?
答案 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();