2017-08-04 43 views
1

我想有傑克遜保存值一起類型,如下所示:傑克遜爲什麼不保存類型?

@Test 
public void doesNotSaveNestedTypes() throws JsonProcessingException { 
    ObjectMapper mapper = new ObjectMapper(); 
    mapper.enable(SerializationFeature.INDENT_OUTPUT); 
    mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT, JsonTypeInfo.As.WRAPPER_ARRAY); 
    mapper.registerSubtypes(MyResultList.class, MyResult.class); 
    String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(getMyResultList()); 
    System.out.println(json); 
} 

private MyResultList getMyResultList(){ 
    List<MyResult> myList = new ArrayList<>(3); 
    myList.add(new MyResult(1)); 
    myList.add(new MyResult(2)); 
    return new MyResultList(myList); 
} 

的類型是不是在生成的JSON:

{ 
    "myResults" : [ { 
    "r" : 1 
    }, { 
    "r" : 2 
    } ] 
} 

以下是參與這個例子類:

public class MyResult { 
    private int r; 
    public MyResult(){} 
    public MyResult(int r){this.r = r;} 

    public int getR() { 
     return r; 
    } 

    @Override 
    public String toString() { 
     return "MyResult{" + 
       "r=" + r + 
       '}'; 
    } 
} 

import lombok.*; 

import java.util.List; 

@Data 
@RequiredArgsConstructor 
@EqualsAndHashCode 
@ToString 
public class MyResultList { 
    @NonNull 
    private final List<MyResult> myResults; 
} 

基於文檔,我期待得到如下:

{ 
    ["org.mypackage.MyResultList", {"myResults": [ 
["org.mypackage.MyResults", { 
    "r" : 1 
    }, 
    (snip) 

我嘗試刪除lombok屬性 - 這根本沒有任何幫助。 如何製作傑克遜保存類型?

+0

請添加預期的輸出 – msfoster

+0

@msfoster預期的輸出添加。 – AlexC

回答

1

問題是JAVA_LANG_OBJECT。你需要NON_FINAL。下面是這些選項從docs的描述:

  • JAVA_LANG_OBJECT:僅影響類型的屬性Object.class
  • OBJECT_AND_NON_CONCRETE:影響Object.class和所有非具體類型(抽象類,接口)
  • NON_CONCRETE_AND_ARRAYS:與上面相同,並且所有數組類型相同(直接元素是非具體類型或Object.class)
  • NON_FINAL:影響所有未聲明爲「final」的類型,以及非最終數組類型元素類型。

使用NON_FINAL會導致這樣的輸出:

[ "org.mypackage.MyResultList", { 
    "myResults" : [ "java.util.ArrayList", [ [ "org.mypackage.MyResult", { 
    "r" : 1 
    } ], [ "JacksonBinding.MyResult", { 
    "r" : 2 
    } ] ] ] 
} ] 

看不到的方式來避免在輸出"java.util.ArrayList"沒有註釋。

+0

它具有「java.util.ArrayList」實際上是有用的,所以這個工作 – AlexC