是否可能:在类中有一个字段,但在Jackson库中序列化/反序列化期间为它取不同的名称?
例如,我有一个类“coordindiantes”。
class Coordinates{
int red;
}
对于JSON的反序列化,希望有这样的格式:
{
"red":12
}
但是当我序列化对象时,结果应该是这样的:
{
"r":12
}
我试图通过在getter和setter上应用@JsonProperty注释来实现这一点(具有不同的值):
class Coordiantes{
int red;
@JsonProperty("r")
public byte getRed() {
return red;
}
@JsonProperty("red")
public void setRed(byte red) {
this.red = red;
}
}
但我有个例外:
org.codehaus.jackson。map。exx . unrecognizedpropertyexception:无法识别的字段“red”
对于Kotlin的人:
data class TestClassDTO(
@JsonProperty("user_name")
val username: String
)
你将成功地从RestControllers中的POST有效载荷处理{"user_name": "John"}
但是当您需要用相同的@JsonProperty名称进行序列化时,您可以使用这种反射方法
fun Any.forceSerialize(separator: String, sorted: Boolean = false): String {
var fieldNameToAnnotatedNameMap = this.javaClass.declaredFields.map { it.name }.associateWith { fieldName ->
val jsonFieldName =
this::class.primaryConstructor?.parameters?.first { it.name == fieldName }?.annotations?.firstOrNull { it is JsonProperty }
val serializedName = if (jsonFieldName != null) (jsonFieldName as JsonProperty).value else fieldName
serializedName
}
if (sorted)
fieldNameToAnnotatedNameMap = fieldNameToAnnotatedNameMap.toList().sortedBy { (_, value) -> value}.toMap()
return fieldNameToAnnotatedNameMap.entries.joinToString(separator) { e ->
val field = this::class.memberProperties.first { it.name == e.key }
"${e.value}=${field.javaGetter?.invoke(this)}"
}
}