我有一個物件串列,每個物件都有指定的欄位(變數型別),所以我想我將創建一個主類(超類),其中包含共享元素(變數)和兩個特定型別變數的子類。我想將所有子類反序列化為超類的型別,以便我可以將所有這些 Json 放在相同物件的串列中。
這是我的 Json 的一個例子
[ { "query": "age", "type": "numeric", "min": 5, "max": 99 }, { "query": "diagnosis", "type": "string", "in ": ["husten", "schnupfen"] } ]
我寫的反序列化代碼是:
public class Query{
private String query;
private String type;
// Getters and Setters and constructor
}
public class QueryString extends Query implements Serializable {
private List<String> in;
private String like;
// Getters and Setters and constructor
}
public class QueryNum extends Field implements Serializable {
private Number min;
private Number max;
// Getters and Setters and constructor
}
使用 ObjectMapper 的序列化按預期作業,但編譯器通過反序列化告訴我有一個無法識別的值(這是我的子類的欄位)。
我想獲得一個包含 QueryString 和 QueryNum 的物件串列(查詢)串列。
Java中的Jackson Json可以實作嗎?
對于我使用的反序列化:
ObjectMapper mapper = new ObjectMapper(); List<Query> queries= Arrays.asList(mapper.readValue(JsonString, Query[].class));
提前致謝
uj5u.com熱心網友回復:
如果每個物件中有一個欄位可用于識別要構建的物件,則可以使用注釋@JsonTypeInfo:
用于配置型別資訊是否以及如何與 JSON 序列化和反序列化一起使用的詳細資訊的注釋,以保留有關 Object 實體的實際類的資訊。這對于多型型別是必要的,也可能需要鏈接抽象宣告型別和匹配的具體實作。
和@JsonSubTypes:
與 JsonTypeInfo 一起使用的注釋來指示可序列化多型型別的子型別,并關聯 JSON 內容中使用的邏輯名稱(這比使用物理 Java 類名稱更可移植)。
或者還有JsonTypeName:
用于系結被注釋類具有的邏輯名稱的注釋。與 JsonTypeInfo(特別是它的 JsonTypeInfo.use() 屬性)一起使用來建立型別名稱和型別之間的關系。
基本上,您需要定義一個屬性,其中包含與要在 中實體化的類相關的資訊,@JsonTypeInfo并在中定義可能的值@JsonSubTypes
這是一個例子
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = As.PROPERTY,
property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "dog"),
@JsonSubTypes.Type(value = Cat.class, name = "cat")
})
public class Animal {
// The property type is used to know what object instantiate
private String type;
...
}
@JsonTypeName("dog")
public class Dog extends Animal {
...
}
@JsonTypeName("cat")
public class Cat extends Animal {
...
}
如果您沒有這樣的欄位,則需要創建一個自定義反序列化器。
另一種方法是將您的記錄轉換為一個串列,Map因為 aMap可以保存任何有效物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/388863.html
