2013-08-27 53 views
4

我想將對象的HashMap序列化爲字符串,但是特定的對象具有對當前類的引用,導致無限遞歸,這似乎不能用通常的JsonIdentifyInfo註釋。這裏有一個例子:使用Jackson的循環引用的鍵的序列化

public class CircularKey { 

    public void start() throws IOException { 
     ObjectMapper mapper = new ObjectMapper(); 

     Cat cat = new Cat(); 

     // Encode 
     String json = mapper.writeValueAsString(cat); 
     System.out.println(json); 

     // Decode 
     Cat cat2 = mapper.readValue(json, Cat.class); 
     System.out.println(mapper.writeValueAsString(cat2)); 
    } 
} 

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id") 
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class") 
class Mouse { 
    int id; 

    @JsonProperty 
    Cat cat; 
} 

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id") 
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class") 
class Cat { 
    int id; 

    @JsonSerialize(keyUsing = MouseMapKeySerializer.class) 
    @JsonDeserialize(keyUsing = MouseMapKeyDeserializer.class) 
    @JsonProperty 
    HashMap<Mouse, String> status = new HashMap<Mouse, String>(); 

    public Cat() { 
     Mouse m = new Mouse(); 
     m.cat = this; 
     status.put(m, "mike"); 
    } 

} 

這裏有一個關鍵的串行器/解串器:

class MouseMapKeySerializer extends JsonSerializer<Mouse> { 
static ObjectMapper mapper = new ObjectMapper(); 

@Override 
public void serialize(Mouse value, JsonGenerator generator, 
     SerializerProvider provider) throws IOException, 
     JsonProcessingException { 
    String json = mapper.writeValueAsString(value); 
    generator.writeFieldName(json); 
} 
} 

class MouseMapKeyDeserializer extends KeyDeserializer { 
static ObjectMapper mapper = new ObjectMapper(); 

@Override 
public Mouse deserializeKey(String c, DeserializationContext ctx) 
     throws IOException, JsonProcessingException { 
    return mapper.readValue(c, Mouse.class); 
} 
} 

如果我切換地圖的HashMap(字符串對象),它的工作原理,但我不能改變原有的映射。有任何想法嗎?

回答

0

它看起來像你在http://jackson-users.ning.com/forum/topics/serializing-hashmap-with-object-key-and-recursion找到你的答案。這似乎是不可能的,因爲:

複雜鍵很棘手,它不是我曾考慮過的用例。再次,沒有什麼特別阻止使用標準組件;主要擔心的僅僅是JSON所具有的侷限性(必須是String-value,JsonParser/JsonGenerator將鍵作爲不同的標記公開)。 沒有明確支持對象鍵的多態類型或對象標識。標準串行器/反序列化器大多用於相對簡單的類型,可以方便可靠地轉換爲字符串/從字符串轉換;數字,日期,UUID。因此:與值處理程序不同,在模塊化設計(與TypeSerializer/JsonSerializer分離)有意義的情況下,我認爲您需要做的是讓定製(de)序列化程序處理所有方面。您應該能夠使用現有的值(de)序列化器,類型(de)序列化器中的代碼,但不能使用類本身。

你的用例聽起來很有趣,但無論好壞,它都在推動着這個信封。 :-)

+0

該鏈接現已停止。 –