![](/img/trans.png)
[英]How can I use @JsonTypeInfo and @JsonSubTypes to instantiate Classes with different configurations?
[英]How can I get Jackson JsonTypeInfo to use relative path
我想使用JsonTypeInfo進行多態類型處理,但是JsonTypeInfo.Id.MINIMAL_CLASS的行為與我認為的方式不符。 這是設置。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.3</version>
</dependency>
基類:
package foo.jackson;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
@JsonTypeInfo(
use=JsonTypeInfo.Id.MINIMAL_CLASS,
include=JsonTypeInfo.As.WRAPPER_OBJECT )
public class Example {
protected String example = "_example";
public String getExample() { return example; }
public void setExample(String example) { this.example = example; }
}
兒童班:
package foo.jackson.stuff;
public class Car extends foo.jackson.Example {
protected String make = "Duesenberg";
public String getMake() { return make; }
public void setMake(String make) { this.make = make; }
}
調用:
foo.jackson.Example ex = new foo.jackson.Example();
foo.jackson.Example car = new foo.jackson.stuff.Car();
try {
ObjectMapper json = new ObjectMapper();
log.info("Base {}",json.writeValueAsString(ex));
String stCar = json.writeValueAsString(car);
log.info("Child {}",stCar);
foo.jackson.Example parse = json.readValue(stCar, foo.jackson.Example.class);
log.info( "Got {}", parse.getClass().getCanonicalName() );
}
catch (JsonProcessingException jpe) {
log.error("Whoops {}", jpe.toString());
}
會產生:
Base {".Example":{"example":"_example"}}
Child {".Car":{"example":"_example","make":"Duesenberg"}}
Whoops com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve type id 'foo.jackson.Car' as a subtype of [simple type, class foo.jackson.Example]: no such class found
如果更改為JsonTypeInfo.Id.CLASS,則會得到:
Base {"foo.jackson.Example":{"example":"_example"}}
Child {"foo.jackson.stuff.Car":{"example":"_example","make":"Duesenberg"}}
Got foo.jackson.stuff.Car
我對Jackson文檔的解釋是MINIMAL_CLASS應該使用相對路徑,我應該得到:
Base {".Example":{"example":"_example"}}
Child {".stuff.Car":{"example":"_example","make":"Duesenberg"}}
Got foo.jackson.stuff.Car
好像我錯過了一步。 如果我在序列化時使用writerWithType(foo.jackson.Example.class) ,那么我會得到預期的行為:
foo.jackson.Example ex = new foo.jackson.Example();
foo.jackson.Example car = new foo.jackson.stuff.Car();
try {
ObjectMapper json = new ObjectMapper();
log.info("Base {}",json.writeValueAsString(ex));
String stCar = json
.writerWithType(foo.jackson.Example.class)
.writeValueAsString(car);
log.info("Child {}",stCar);
foo.jackson.Example parse = json.readValue(stCar, foo.jackson.Example.class);
log.info( "Got {}", parse.getClass().getCanonicalName() );
}
catch (JsonProcessingException jpe) {
log.error("Whoops {}", jpe.toString());
產生:
Base {".Example":{"example":"_example"}}
Child {".stuff.Car":{"example":"_example","make":"Duesenberg"}}
Got foo.jackson.stuff.Car
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.