2012-07-24 63 views
15

如下面的代碼:使用JSON時,我們可以使對象成爲地圖中的鍵嗎?

public class Main { 

    public class innerPerson{ 
     private String name; 
     public String getName(){ 
      return name; 
     } 
    } 


    public static void main(String[] args){ 
     ObjectMapper om = new ObjectMapper(); 

     Map<innerPerson, String> map = new HashMap<innerPerson,String>(); 

     innerPerson one = new Main().new innerPerson(); 
     one.name = "david"; 

     innerPerson two = new Main().new innerPerson(); 
     two.name = "saa"; 

     innerPerson three = new Main().new innerPerson(); 
     three.name = "yyy"; 

     map.put(one, "david"); 
     map.put(two, "11"); 
     map.put(three, "true"); 



     try { 
      String ans = om.writeValueAsString(map); 

      System.out.println(ans); 


     } catch (JsonGenerationException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (JsonMappingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

} 

輸出是:

{"[email protected]":"david","[email protected]":"true","[email protected]":"11"} 

是否有可能使地圖的關鍵是準確的數據,但不是對象的唯一解決?怎麼樣?

+0

幾天前我遇到了同樣的問題,發現密鑰不能成爲jackson成功序列化/反序列化映射的pojo。 – 2012-07-24 10:21:19

+0

@ShankhoneerChakrovarty是的,當我想序列化一個複雜的對象時必須小心,因爲它可能包含一個以對象作爲鍵的映射結構!真是麻煩! – GMsoF 2012-07-24 12:20:02

回答

23

使用JSON時,我們可以使對象成爲地圖中的關鍵嗎?

嚴格來說,沒有。 JSON 數據結構是JSON 對象數據結構,它是名稱/值對的集合,其中元素名稱必須是字符串。因此,儘管感知並綁定到JSON對象是一個地圖是合理的,但JSON地圖鍵也必須是字符串 - 同樣,因爲JSON地圖是JSON對象。 JSON對象(地圖)結構的規範可在http://www.json.org處獲得。

是否有可能使地圖的關鍵字是精確的數據而不是對象的地址?怎麼樣?

Costi正確地描述了Jackson的默認映射鍵串行器的行爲,它只是調用Java映射鍵的toString()方法。與其修改toString()方法以返回JSON友好型地圖關鍵字表示法,還可以使用Jackson實現自定義地圖關鍵字序列化。其中一個例子是Serializing Map<Date, String> with Jackson

1

您看到的「地址」打印只是您的toString()方法返回的內容。

忽視的JSON編組現在爲了使您的代碼工作,你需要實現:equals(),你InnerPerson類中hashCode()toString()。如果您返回toString()中的name屬性,那麼這將成爲JSON表示中的關鍵字。

但是如果沒有適當的實現equals()hashCode(),你不能正確使用HashMap。

1

除了現有的正確答案,您還可以使用Module接口(通常使用SimpleModule)添加自定義鍵序列化程序和鍵解串器。這使您可以在外部定義密鑰的序列化和反序列化。無論哪種方式,JSON中的鍵必須是字符串,就像其他人指出的那樣。

相關問題