2013-01-17 114 views
15

服務器返回的該部分以反序列化json以上:反序列化JSON上課

@JsonTypeInfo(use=Id.NAME, include=As.WRAPPER_OBJECT) 
@JsonSubTypes({ 
    @JsonSubTypes.Type(value=Not.class, name="not"), 
    @JsonSubTypes.Type(value=And.class, name="and"), 
    @JsonSubTypes.Type(value=Or.class, name="or"), 
    @JsonSubTypes.Type(value=Expression.class, name=""), 
}) 

我標記了合適的構造函數爲@JsonCreator

這對Expression類不起作用。


如果我修改JSON表達對象有名爲 「表情」:

"expression" : { 
    "operand": "a", 
    "operator": "==", 
    "value": "true" 
} 

@JsonTypeInfo(use=Id.NAME, include=As.WRAPPER_OBJECT) 
@JsonSubTypes({ 
    @JsonSubTypes.Type(value=Not.class, name="not"), 
    @JsonSubTypes.Type(value=And.class, name="and"), 
    @JsonSubTypes.Type(value=Or.class, name="or"), 
    @JsonSubTypes.Type(value=Expression.class, name="expression"), 
}) 

試圖解析 「不」,當它失敗條件稱「不能實例化抽象類需要更多關於類型的信息」。所以看起來它在更深入的解析中失去了註釋聲明。


  1. 我不知道是否有可能與傑克遜寫反序列化的原始JSON
  2. 爲什麼第二種方法不適用於Not反序列化
+1

如果您發佈了實際的類層次結構 - 上述代碼看起來不像編譯代碼 –

+1

將代碼修改爲java代碼將會有所幫助。完整的源代碼在這裏:https://github.com/emartynov/spil-games-assignment/tree/master/service-core/src/main/java/com/spilgames/core/condition –

+0

正確的行數: __Not實現Condition__ to __Not implements Condition__ __public class And()extends__ to __public class And extends__ __public class Or()extends__ to __public class or extends__ – Visruth

回答

1

您應該使用一個類工作,而不是一個接口。否則,傑克遜不能創建一個實例。

我相信你也需要爲你的POJO創建默認的(aka no-arg)構造函數供Jackson使用。

另外,創建Jackson映射的一個很好的通用方法是實例化類的Java實例,然後使用Java - > JSON創建JSON。這使得它更容易理解映射是如何不同的 - 從JSON - > Java更難調試。

+0

湯姆,謝謝你的回覆。你能否提出上面的json例子中的類層次結構,它將被Jackson正確地反序列化? –

+0

請給我發表意見請回答 –

+0

對不起 - 我現在真的很忙。作爲第一步,我建議在你的類中使用無參數構造函數。另外,從層次結構的頂部開始工作。簡單的類「public class Condtion {Map condition;}」應該在默認情況下反序列化,然後檢查結果併爲每個元素緩慢添加更多特定的映射。 –

18

我不得不完成一些非常相似的事情,這裏是一段摘錄。

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "@class") 
@JsonSubTypes({ 
    @JsonSubTypes.Type(value=IMetricCollection.class, name="MetricCollection"), 
    @JsonSubTypes.Type(value=IMetricDouble.class, name="MetricDouble"), 
    @JsonSubTypes.Type(value=IMetricInteger.class, name="MetricInteger"), 
    @JsonSubTypes.Type(value=IMetricPlot.class, name="MetricPlot"), 
    @JsonSubTypes.Type(value=IMetricString.class, name="MetricString"), 
    @JsonSubTypes.Type(value=IMetricMatrix.class, name="MetricMatrix") 
}) 

public interface IMetric extends HasViolations<IViolation>, Serializable { 

    /** 
    * Getter for the name of the object. 
    * 
    * @return 
    */ 
    public abstract String getName(); 

    /** 
    * Set the name of the object. 
    * 
    * @param name 
    */ 
    public abstract void setName(String name); 

    /** 
    * Returns true if metric has violations. 
    * @return 
    */ 
    public abstract boolean hasMetricViolations(); 
} 

這看起來可能使用的接口類型的直覺,但我可以告訴用什麼具體的類接口讓這一切工作。在另一個項目中,我還有另一個代碼塊,它覆蓋JsonSubTypes以實例化它自己類型的類,如果這有幫助的話。

@JsonDeserialize(as=MetricMatrix.class) 
public interface IMetricMatrix<C extends IColumn> extends IMetric { 

    public static interface IColumn extends IMetricCollection<IMetric> { 
    } 

    public static interface IIntegerColumn extends IColumn { 
    } 

    public static interface IDoubleColumn extends IColumn { 
    } 

    public static interface IStringColumn extends IColumn { 
    } 


    public abstract List<C> getValue(); 

    public abstract void setValue(List<C> value); 

    public abstract void addColumn(C column); 
} 

在這個類中我可以分析相同的REST消息,但我重寫這個項目的原項目的具體類型和亞型使他們執着。由於類型名稱相同,我可以重寫此對象類型使用的接口。請記住,我正在使用@class屬性,但這完全是任意的,可以是@whatever註解,但它需要在兩側匹配。這不是使用JsonTypeInfo.Id.Class註釋。

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "@class") 
@JsonSubTypes({ 
    @JsonSubTypes.Type(value=IMetricCollectionEntity.class, name="MetricCollection"), 
    @JsonSubTypes.Type(value=IMetricDoubleEntity.class, name="MetricDouble"), 
    @JsonSubTypes.Type(value=IMetricIntegerEntity.class, name="MetricInteger"), 
    @JsonSubTypes.Type(value=IMetricPlotEntityEntity.class, name="MetricPlot"), 
    @JsonSubTypes.Type(value=IMetricStringEntity.class, name="MetricString"), 
    @JsonSubTypes.Type(value=IMetricMatrixEntity.class, name="MetricMatrix") 
}) 
public interface IMetricEntity extends IDatastoreObject, IMetric { 

    public String getContext(); 

    public List<IViolation> getViolations(); 
} 



@JsonDeserialize(as=MetricMatrixEntity.class) 
public interface IMetricMatrixEntity extends IMetricEntity { 

    public static interface IColumnEntity extends IColumn { 
     public String getName(); 
    } 

    public static interface IIntegerColumnEntity extends IColumnEntity { 
    } 

    public static interface IDoubleColumnEntity extends IColumnEntity { 
    } 

    public static interface IStringColumnEntity extends IColumnEntity { 
    } 

    public abstract List<IColumnEntity> getValue(); 

    public abstract void setValue(List<IColumnEntity> value); 

    public abstract void addColumn(IColumnEntity column); 
} 
+0

克里斯,謝謝你的回答。你能提供你的json例子還是看看我的?這幾乎是我的代碼,但對json進行了一些修改。 –