2011-11-25 33 views
0

当我尝试序列化和反序列化,看起来通用对象Set<ClassA<?>>如下:杰克逊配置写枚举的对象

public class ClassA<T> { 

private ClassB datum; 
private T value; 
... 
} 

如果T恰好是一个枚举,它被写成一个字符串值。这对序列化来说很好,但是当我反序列化时,不可能知道字符串值是否是一个枚举。然后杰克逊将产生的对象转换为一个字符串,并得到ClassA<String>而不是ClassA<SomeEnumType>

在杰克逊有一个配置让它创建一些提示,该值是一个枚举?或者也许把枚举变成一个JSON对象而不是一个字符串值?

回答

1

在杰克逊有没有一个配置让它创建一些提示值是一个枚举?

可能从匹配的JSON字符串值反序列化为枚举实例。或者这种方式不适用于你的情况?

这里是一个例子。

import java.util.Set; 
import java.util.TreeSet; 

import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; 
import org.codehaus.jackson.annotate.JsonMethod; 
import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.map.type.TypeFactory; 

public class JacksonFoo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY); 

    String myEnumJson = mapper.writeValueAsString(MyEnum.MyEnum1); 

    System.out.println(myEnumJson); 

    MyEnum myEnum = mapper.readValue(myEnumJson, MyEnum.class); 

    System.out.println(myEnum); 

    Set<ClassA<MyEnum>> set = new TreeSet<ClassA<MyEnum>>(); 
    set.add(new ClassA<MyEnum>(new ClassB("bValue7"), MyEnum.MyEnum1)); 
    set.add(new ClassA<MyEnum>(new ClassB("bValue8"), MyEnum.MyEnum2)); 
    String setJson = mapper.writeValueAsString(set); 
    System.out.println(setJson); 

    TypeFactory typeFactory = TypeFactory.defaultInstance(); 

    Set<ClassA<MyEnum>> setCopy = mapper.readValue(setJson, 
     typeFactory.constructCollectionType(Set.class, 
      typeFactory.constructParametricType(ClassA.class, MyEnum.class))); 
    System.out.println(setCopy); 
    } 
} 

class ClassA<T> implements Comparable<ClassA<T>> 
{ 
    ClassB datum; 
    T value; 

    ClassA() 
    { 
    } 

    ClassA(ClassB datum, T value) 
    { 
    this.datum = datum; 
    this.value = value; 
    } 

    @Override 
    public int compareTo(ClassA<T> o) 
    { 
    return 42; 
    } 

    @Override 
    public String toString() 
    { 
    return String.format("ClassA: datum=%s, value=%s", datum, value); 
    } 
} 

class ClassB 
{ 
    String bValue; 

    ClassB() 
    { 
    } 

    ClassB(String bValue) 
    { 
    this.bValue = bValue; 
    } 

    @Override 
    public String toString() 
    { 
    return String.format("ClassB: bValue=%s", bValue); 
    } 
} 

enum MyEnum 
{ 
    MyEnum1("myEnum1", 1), MyEnum2("myEnum2", 2); 

    String name; 
    int id; 

    MyEnum(String name, int id) 
    { 
    this.name = name; 
    this.id = id; 
    } 
} 

输出:

"MyEnum1" 
MyEnum1 
[{"datum":{"bValue":"bValue7"},"value":"MyEnum1"},{"datum":{"bValue":"bValue8"},"value":"MyEnum2"}] 
[ClassA: datum=ClassB: bValue=bValue7, value=MyEnum1, ClassA: datum=ClassB: bValue=bValue8, value=MyEnum2] 

如果由于某种原因,它是需要有枚举序列化为的POJO,随后便出现需要自定义序列化处理。 Serializing enums with Jackson

+1

为了感兴趣,我登录了杰克逊问题725,讨论并跟踪一个可能的增强功能,以便轻松配置(de)序列化枚举状态。 http://jira.codehaus.org/browse/JACKSON-725投票和评论,如果你想要它。 –

+0

谢谢布鲁斯,我不知道typeFactory.constructCollectionType和typeFactory.constructParametricType。这就是我一直在寻找的。 –