我正在尝试解析一个API调用的结果,该调用返回唯一的第一个属性。
{
"AlwaysDifferent12345": {
"fixedname1" : "ABC1",
"fixedname2" : "ABC2"
}
}
我正在使用retrofit 2和Jackson/gson,但不知道如何科普retrofit 2框架中的动态属性名称。
data class AlwaysDifferentDTO(
@JsonProperty("AlwaysDifferent12345") val alwaysDifferentEntry: AlwaysDifferentEntry
)
我试过了
data class AlwaysDifferentDTO(
@JsonProperty
val response: Map<String, AlwaysDifferentEntry>
)
但这会返回错误Can not instantiate value of type... API的返回值是固定的,即map〈string,object〉。
我读过你可以写一个反序列化器,但是看起来我需要反序列化整个对象,而我想做的只是忽略与响应关联的字符串。
我已经阅读了https://discuss.kotlinlang.org/t/set-dynamic-serializedname-annotation-for-gson-data-class/14758和其他几个答案。鉴于独特的属性名称是相当常见的,这将是很好的了解人们如何处理这一点时,使用retrofit 2
谢谢
1条答案
按热度按时间nwnhqdif1#
因为
JSON
没有一对一的Map,所以Jackson
无法使用annotations
自动Map它。您需要创建自己的Deserializer
。在本教程中,您可以学习如何为
Jackson
创建您自己的自定义Deserializer
。https://www.baeldung.com/jackson-deserialization在本教程中,您将看到
deserialize
函数下的第一行是JsonNode node = jp.getCodec().readTree(jp);
使用这一行代码,您可以获得整个JSON节点,一旦获得该节点,您就可以调用此函数
JsonNode AlwaysDifferent12345Node = node.findParent("fixedname1");
现在你已经有了这个节点,你可以像本教程的其余部分所示的那样检索它的值。一旦你有了所有的值,你就可以返回一个新的
AlwaysDifferentDTO
数据类的示例。