2013-07-02 29 views
1

比方說,我有以下的JSON:傑克遜 - 如何應用基於json內容的自定義反序列化?

{ 
    "first_path": "/just/a/path", 
    "second_path": "/just/another/path", 
    "relative_path": { "$relative": "some_file" }, 
} 

而且我有,我不能修改類:

public class Paths { 
    public String first_path; 
    public String second_path; 
    public String third_path; // Can't mark this with annotations 
} 

我想要的是一些自定義的反序列化邏輯應用到所有的字符串值,如果它們在json中看起來像{「$ ...」:「...」}。在我的例子中,我顯然會根據某些邏輯將相對路徑轉換爲絕對路徑,並將絕對路徑放入Paths.third_path成員中。

傑克遜怎麼能實現這一點?

回答

0

花費幾個小時後,我發現通過重寫字符串反序列化這樣的方式有以下幾點:

public class PathJsonDeserializer extends JsonDeserializer<String> { 
    @Override 
    public String deserialize(JsonParser parser, DeserializationContext context) 
        throws IOException, JsonProcessingException { 

     JsonToken token = parser.getCurrentToken(); 
     if (token.equals(JsonToken.START_OBJECT)) { 
      // This String value looks like an object - try to parse $relative 
      Path path = parser.readValueAs(Path.class); 
      return path.$relative; 
     } else { 
      // This is normal String value 
      return parser.getText(); 
     } 
    } 
} 

而Path類是:

public class Path { 
    public String $relative; 
} 

的PathJsonDeserializer應加像往常一樣通過模塊映射器。 還有其他更多的組件方法嗎?對於這種情況,如果我有幾個基於不同邏輯的基於$的規則。