当列表的各个项目使用Retrofit和Gson的格式不同时,如何解析json列表?
Posted
技术标签:
【中文标题】当列表的各个项目使用Retrofit和Gson的格式不同时,如何解析json列表?【英文标题】:How to parse json list when the list's individual items are not of the same format using Retrofit and Gson? 【发布时间】:2020-10-30 20:33:53 【问题描述】:我正在使用Retrofit
和Gson
与服务器通信并解析响应。
我正在从服务器接收 geometry 对象列表。但是对象的坐标字段可能会有所不同。例如,我正在从服务器接收以下 json:
"geometry":
"type":"Point",
"coordinates": [
76.95210456848145,
43.2790799527603
]
有时这个对象会以这种格式返回我:
"geometry":
"type":"Polygon",
"coordinates":[
[
[76.9478130340576,43.286265501840916],
[76.9482421875,43.276267985142056],
[76.95098876953125,43.27101863123778]
]
]
如您所见,有时coordinates
字段只是一个列表(在第一个示例中)。有时,该字段是 3 级深度列表(在第二个示例中)。
因此,由于列表中元素的格式不同,我无法正确解析列表。
我怎样才能正确解析这个?
目前,我正在使用这个数据类:
data class Geometry(
@SerializedName("coordinates")
val coordinates: List<List<List<Double>>>,
@SerializedName("type")
val type: String)
【问题讨论】:
【参考方案1】:如果您知道该文件有 2 个版本,请为每个文件创建一个内部类。在解析时,识别“坐标”的类型,如果是第一种,则继续第一种,如果是第二种,则继续第二种
inner class GeometryV2(
@SerializedName("coordinates")
val coordinates: List<List<List<Double>>>,
@SerializedName("type")
val type: String)
inner class GeometryV1(
@SerializedName("coordinates")
val coordinates: List<Double>,
@SerializedName("type")
val type: String)
【讨论】:
以上是关于当列表的各个项目使用Retrofit和Gson的格式不同时,如何解析json列表?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Retrofit2 和 GSON 转换器解决“古怪”的 JSON API
ProGuard for Android 和 Retrofit2 Converter Gson?