使用Retrofit和Jackson或Gson解析Android上的API结果

kyks70gy  于 2022-11-06  发布在  Android
关注(0)|答案(1)|浏览(253)

我正在尝试解析一个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
谢谢

nwnhqdif

nwnhqdif1#

因为JSON没有一对一的Map,所以Jackson无法使用annotations自动Map它。您需要创建自己的Deserializer
在本教程中,您可以学习如何为Jackson创建您自己的自定义Deserializerhttps://www.baeldung.com/jackson-deserialization
在本教程中,您将看到deserialize函数下的第一行是
JsonNode node = jp.getCodec().readTree(jp);
使用这一行代码,您可以获得整个JSON节点,一旦获得该节点,您就可以调用此函数
JsonNode AlwaysDifferent12345Node = node.findParent("fixedname1");
现在你已经有了这个节点,你可以像本教程的其余部分所示的那样检索它的值。一旦你有了所有的值,你就可以返回一个新的AlwaysDifferentDTO数据类的示例。

相关问题