簡體   English   中英

如何獲得Jackson JsonTypeInfo以使用相對路徑

[英]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
  1. 我錯過了一步嗎?
  2. 我是否誤解了每班注釋文檔?
  3. 這是一個Jackson問題,我應該只使用JsonTypeInfo.Id.CLASS?

好像我錯過了一步。 如果我在序列化時使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM