Genson可以处理对象上的通用嵌套字段吗?

时间:2013-02-05 00:11:00

标签: java json jersey genson

基本上我有一些我希望序列化为JSON的Java对象尽可能少头疼。现在我正在使用Tomcat,Jersey和Genson。

我发现像Genson这样的东西不起作用(当然这是玩具的例子):

public class Main {
    public static void main(String[] args) {
        MyClass mc = new MyClass();
        mc.mapOfSets = new HashMap<>();
        Set<String> set0 = new HashSet<>();
        set0.add("0");
        Set<String> set1 = new HashSet<>();
        set1.add("1");
        set1.add("11");
        Set<String> set2 = new HashSet<>();
        set2.add("2");
        set2.add("22");
        set2.add("222");
        mc.mapOfSets.put("set0", set0);
        mc.mapOfSets.put("set1", set1);
        mc.mapOfSets.put("set2", set2);
        try {
            String json1 = new Genson().serialize(mc.mapOfSets);
            System.out.println(json1);
            String json = new Genson().serialize(mc);
            System.out.println(json);
        } catch (TransformationException | IOException e) {
            e.printStackTrace();
        }
    }
}

class MyClass {
    public Map<String, Set<String>> mapOfSets;
}

以上的输出是:

{"set1":["1","11"],"set0":["0"],"set2":["2","222","22"]}
{"mapOfSets":{"empty":false}}

Genson的好处是我把它放在我的WebContent文件夹中,而不是与泽西捆绑在一起的东西 - 不需要额外的配置。如果有一个非常直接的方法来获得像上面这样的对象序列化到JSON而不必为每个模式编写某种转换器,我很乐意用它来代替Jersey而不是Genson,但Genson并没有让我失望远远不够。

那么 - 我如何按摩Genson以正确序列化 - 或者什么是无痛地处理这类事情的图书馆?

谢谢!

2 个答案:

答案 0 :(得分:2)

我是Gensons的作者。我刚检查过,这是一个bug,除了这个特殊情况外,Genson中的泛型工作正常... 如果你可以等到明天,我今晚将推出一个包含修复程序的新版本以及一些小的新功能。完成后我会更新我的答案。

编辑更正错误并将0.94推送到公共maven repo,它应该在最多几个小时内可用。以下是一些changes in this release。请尝试并确认它是否解决了您的问题。谢谢:))

答案 1 :(得分:0)

我正在使用Guice来处理我的依赖注入需求,这就是为什么我很难让Jackson与我的Jersey项目集成。由于Genson没有做我想做的事情,所以我决定再次尝试杰克逊。我尝试改变一些事情直到它起作用,在SO和Google上尝试不同的建议。

现在,以下内容在我的Sandbox项目中提供了预期的输出:

ObjectMapper mapper = new ObjectMapper();
AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();
mapper.getSerializationConfig().setAnnotationIntrospector(introspector);
String jsonData = mapper.writeValueAsString(mc);
System.out.println(jsonData);

{"mapOfSets":{"set1":["1","11"],"set0":["0"],"set2":["2","222","22"]}}