首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Genson中使用@JsonConverter?

如何在Genson中使用@JsonConverter?
EN

Stack Overflow用户
提问于 2019-04-13 22:14:14
回答 1查看 312关注 0票数 0

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

如果我将其序列化为JSON,然后再序列化为Java,它会工作得很好。但我正在用JavaScript进行反序列化。

JavaScript不支持完整的64位unsigned int作为数字(我发现我的id的最后几位在JavaScript中被置零),所以我需要在序列化过程中将长id转换为字符串。

我不想转换对象中的所有Long,所以我只对id字段使用Converter。

代码语言:javascript
复制
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; 

我的转换器代码如下所示:

代码语言:javascript
复制
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());
        }
    }
}

在调用序列化本身时,我没有做任何特殊的事情:

代码语言:javascript
复制
    Genson genson = new GensonBuilder().useIndentation(true).create();
    String json = genson.serialize( order );

这不管用。输出仍然是这样的:

代码语言:javascript
复制
{
  "clientKey":9923001278,
  "id":1040012110000000002
}

我想要实现的是:

代码语言:javascript
复制
{
  "clientKey":9923001278,
  "id":"1040012110000000002"   // value is quoted
}

我也试着将我的转换器传递给一个GensonBuilder,但它命中了对象中的所有Long,这并不是我需要的。

有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2019-04-16 10:03:29

好吧,我不清楚为什么,但看起来Genson就是没有得到注释。这可能归因于Hibernate或Lombok的使用。

解决方案似乎是强制Genson考虑带注释的字段。

我通过使用GensonBuilder实现了这一点:

代码语言:javascript
复制
Genson genson = new GensonBuilder().useIndentation(true).include("id").create();
String json = genson.serialize( order );

编辑:结合Eugen上面的答案,这也是可行的,因为它指示Genson查看私有字段,而不是依赖于getter/setter:

代码语言:javascript
复制
Genson genson2 = new GensonBuilder().useFields(true, VisibilityFilter.PRIVATE).useMethods(true).create();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55666438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档