-2

どの Kotlin クラスでも、 format のパブリック プロパティごとに 1 つのメソッドが生成されるcomponentX()ため、このクラスは次のようになります。

public data class Dog(public var name: String, public var age: Double)

Java では次のようなものと同等です。

public class Dog {
    private String name;
    private double age;

    public Dog(@NotNull String name, @NotNull double age) {
        // assign values
    }

    // Getters and setters for name and age
    // toString(), equals(), and hashCode()

    public String component1() { return name; }
    public double component2() { return age;  }
}

componentX()これは、ジャクソンを各メソッド見なし、各メソッドgetXxx()を (逆) シリアル化ターゲットと見なすため、混乱します。

私がこれまでこれを回避してきた方法は、すべてのモデルを Java で作成することでしたが、これは好ましくありません。

つまり、componentX()メソッドを無視するように ObjectMapper を構成するにはどうすればよいですか?

4

2 に答える 2

0

注: 受け入れられた回答に記載されている @JsonFilter の詳細は必要ありません

Jackson のデフォルトの動作以上のものは必要ありません。現在および最近の Jackson バージョンを使用すると、説明されているような動作はありません。org.codehaus.*Googleでは、代わりにとしてパッケージ化された古いバージョンが表示されることがあります。com.fasterxml.*

Jackson では、プロパティが JavaBean プロパティのように見えない場合、デシリアライズされません。またcomponentX、JavaBean プロパティのようには見えません。

これは、未加工の Jackson とKotlin 用の Jackson モジュールの両方を組み合わせて使用​​することを証明するテスト ケースで、両方とも期待どおりに動作し、どちらにもこの問題はありません。

class StackOverflowTest {
    public data class Dog(public var name: String, public var age: Double)

    @Test public fun testSimpleDeser() {
        val dogObj = Dog("Avi", 1.5)
        val expectedJson = """{"name":"Avi","age":1.5}"""

        assertEquals(expectedJson, ObjectMapper().writeValueAsString(dogObj))
        assertEquals(expectedJson, jacksonObjectMapper().writeValueAsString(dogObj))
    }
}

Jackson でテストを実行しましたが、これらはすべて Kotlin で長い間使用されているため、この問題はない2.6.4と確信しています。2.5.x2.6.x2.7.x

于 2015-12-31T11:53:59.307 に答える