Skip to content

Support for Multi field value class #714

Open
@k163377

Description

@k163377

There is a discussion in Kotlin about value class with multiple fields(MFVC).
Kotlin/KEEP#339

This issue summarizes the MFVC support in jackson-module-kotlin.
Please note that MFVC has not yet been formalized and with the current update policy of jackson-module-kotlin, support may not be implemented for several more years.

The following DTO is used in the following description.

@JvmInline
value class MFVC(val v1: Int, val v2: String, val v3: String?)

data class Data(val v: MFVC)

About serialize

As for serialization, it is likely to be supportable.

When serializing MFVC, we believe that it should be the same as a normal class.
In other words, the Data class above would be serialized as follows

{
  "v": {
    "v1": 1,
    "v2": "2",
    "v3": "3"
  }
}

To achieve this, we need to exclude unboxed getters generated for each MFVC property.
At the moment, the Data class above generates four getters: getV, getV-v1, getV-v2, and getV-v3, which means we have to exclude getV-v1, v2, and v3.

There are two possible ways to do this.

The first is to exclude all but Kotlin Property from the serialization result.
You can distinguish unboxed getters in that they are not Kotlin Property.
However, this would be a destructive change and would likely be implemented as an option.

The second is name-based exclusion.
The separator in the name of an unboxed getter could be changed to a more special name, such as -$.
Kotlin/KEEP#340 (comment)
If this change were made, it would make it easier to exclude by name only.

Personally, I prefer the latter method.
The latter method is easier to implement, whereas the former is more complex to implement, and the getter-like function is no longer available.

About deserialize

Supporting deserialization appears to be very difficult.

For the Data class, the constructor that jackson can call is probably of the form Data(int,java.lang.String,java.lang.String).
This is the unboxed form of each property of MFVC.
This means that the number of arguments does not match the number of parameters in Kotlin (= number of properties in JSON).

I haven't done any deep research, but I can't think of any way to support this in Jackson.

If the @JvmExpose annotation is provided by Kotlin, there may be no other way to use it.
Kotlin/KEEP#331

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions