2012-06-25 45 views
1

我需要序列這樣的:地圖狀系列化瓦特/數據值作爲密鑰

List<Event> 

其中事件類是:

public class Event { 
    public int id; 
    public String foo; 
    public String bar; 
} 

成這種形式的JSON:

{ 
    "123":{"foo":"...","bar":"..."}, 
    "345":{"foo":"...","bar":"..."} 
} 

從事件中取出「id」屬性並存儲一個映射可以做到這一點,但我需要支持重複的ID。

是否有一個註釋,我可以把「id」屬性導致傑克遜把它作爲一個關鍵,其餘的對象作爲關聯值?

+0

你必須接受你的答案更經常 – PhD

回答

0

以您當前的ID結構作爲關鍵,我不確定在JSON規範中是否有重複的ID。也許如果你有ID的數組。我認爲你需要重新評估你想要的JSON輸出。

+0

我同意。 JSON的結構並不理想。不幸的是它超出了我的控制範圍。服務器期望這種特定的格式。 – jph

0

你可以使用IdentityHashMap,所以你可以使用字符串的不同實例包含相同的值,有這樣的結果:

{"1":{"foo":"foo1","bar":"bar"},"2":{"foo":"foo2.1","bar":"bar"},"3":{"foo":"foo2","bar":"baz"},"2":{"foo":"foo2","bar":"baz"}} 

,你可以有執行此:

import java.io.IOException; 
import java.util.Arrays; 
import java.util.IdentityHashMap; 
import java.util.List; 

import org.codehaus.jackson.JsonGenerationException; 
import org.codehaus.jackson.annotate.JsonIgnoreProperties; 
import org.codehaus.jackson.map.JsonMappingException; 
import org.codehaus.jackson.map.ObjectMapper; 

public class JacksonTest { 

    public static void main(final String[] args) throws JsonGenerationException, JsonMappingException, IOException { 
     ObjectMapper om = new ObjectMapper(); 

     IdentityHashMap<String, Event> ihm = new IdentityHashMap<String, Event>(); 

     List<Event> list = Arrays.asList(// 
       new Event(1, "foo1", "bar"), // 
       new Event(2, "foo2", "baz"), // 
       new Event(2, "foo2.1", "bar"), // 
       new Event(3, "foo2", "baz") // 
       ); 

     for (Event e : list) { 
      ihm.put(String.valueOf(e.id), e); 
     } 

     System.out.println(om.writeValueAsString(ihm)); 
    } 

    @JsonIgnoreProperties({ "id" }) 
    public static class Event { 
     public int id; 
     public String foo; 
     public String bar; 

     public Event(final int id, final String foo, final String bar) { 
      super(); 
      this.id = id; 
      this.foo = foo; 
      this.bar = bar; 
     } 

    } 

} 
+0

我最終只是做了「手工」的JSON編碼,並用@JsonValue註解該方法。這是在Android上運行的,所以我使用Android的靜態JSONOBject.quote()方法來轉義字符串。 – jph

+0

你可以在這裏發佈你的解決方案...... –

+0

我可以看到'@ JsonValue'是如何工作的,但是不需要引用任何東西 - 只需返回POJO或Map與「正確」結構,串行器就會遞歸地處理它。 – StaxMan