1

次の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 メンバーに配置します。

ジャクソンでこれを達成するにはどうすればよいですか?

4

1 に答える 1

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 は、通常どおりモジュールを介してマッパーに追加する必要があります。他のコンポーネントアプローチはありますか? たとえば、ロジックが異なる $ ベースのルールがほとんどない場合です。

于 2013-07-02T20:36:27.920 に答える