2010-08-02 109 views
1

我正在使用java中的ObjectMapper類對JSON對象進行反序列化。 我正在獲取不同類型的對象(?extends Something),並想知道是否有任何方式以某種通用的方式對它們進行反序列化。 readValue方法獲取輸出對象類型的某些Class類型對象,因此它以某種方式強類型化。通用JSON對象轉換

回答

0

你試過JSON in Java

+0

它不是對象綁定,只是DOM類樹。 – StaxMan 2010-08-02 19:31:40

0

我一直在使用Json-lib庫來實現這個目標,並且對結果非常滿意。 看看庫示例http://json-lib.sourceforge.net/ 您可以註冊自定義morphers,將json的嵌套元素轉換爲適當的類。 我能夠從json到java獲得相當複雜的結構並訪問所有嵌套字段。

希望它可以幫助

+0

這是一個很好的解決方案,我可能會考慮將來使用它 – Roman 2010-08-03 09:17:39

7

傑克遜可以採取不僅類型擦除類作爲目標類型,而且還TypeReference它採用慣用的「超類型令牌」的格局。來自傑克遜常見問題解答:

List<MyBean> result = mapper.readValue(src, new TypeReference<List<MyBean>>() { }); 

這適用於各種類型的泛型,而不僅僅是地圖和集合。這在你想到泛型類型的情況下,所以你只有一個班級但是有多個參數變化。

但它聽起來像也許你想要的是實際上支持反序列化多態類型;這也是支持的(從Jackson 1.5開始,請參閱http://wiki.fasterxml.com/JacksonPolymorphicDeserialization)。

編輯:在對方的回答給定的樣本類,傑克遜的辦法是做:

import org.codehaus.jackson.annotate.JsonTypeInfo; 

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS) 
public abstract class Message 
{ 
    protected Message(){ } 
} 

和反序列化:

Message msg = objectMapper.readValue(json, Message.class); 

得到任何子類消息的。並使用'objectMapper.writeValue();'序列化

0

這是我來到了一個答案:

首先我轉從ObjectMapperGson的。 定義一個抽象類,類型枚舉:

public abstract class Message { 

    private MessageType type; 

    protected Message(){ 
     type = setType(); 
    } 

    protected abstract MessageType setType(); 

    public MessageType getType() { 
     return type; 
    } 

    public void setType(MessageType type) { 
     this.type = type; 
    } 

} 

public enum MessageType { 

    PRESENCE(PresenceMessage.class), 
    TEXT(TextMessage.class); 

    private Class<? extends Message> clazz; 

    private MessageType(Class<? extends Message> clazz){ 
     this.clazz = clazz; 
    } 

    public Class<? extends Message> getClazz() { 
     return clazz; 
    } 
} 

擴展消息每類是我們派出了Json的實際之一。它必須實現getType()方法。

所以desirializing只使用該代碼時:

String line; 
    BufferedReader reader = new BufferedReader(new InputStreamReader(get.getResponseBodyAsStream(),"UTF-8")); 
    while ((line = reader.readLine()) != null){ 
     builder.append(line); 
    } 
    if (clazz == Message.class){ 
     String string = builder.toString(); 
     Message message = gson.fromJson(string,Message.class); 
     if (message.getType() == null) 
      throw new IllegalStateException("Could not de-serialize message " + builder.toString()); 
     return (T)gson.fromJson(string,message.getType().getClazz()); 
    } 

,我希望你可以自己填寫缺少的部分。

+2

傑克遜可以自動執行大量工作,只需在基類上添加一個@JsonTypeInfo註釋。:) 但無論如何,祝你好運! – StaxMan 2010-08-03 17:08:39

+0

你是男人.... !!非常感謝 – Roman 2010-08-08 14:04:18

+0

你應該把它寫成答案,所以我可以接受它。 – Roman 2010-08-08 15:01:03