Java / Kotlin JSON解析改进
我使用了一个API,它给了我这种类型的JSON:
{ "data": { "name": "Start", "pid": "1", "position": { "data": { "x": "31", "y": "330" }, "metadata": "empty" } }, "metadata": "empty" }
我已经创建了与上面的JSON具有相同结构的对象的类。 我使用Android中的GSON
库,里面使用GSON
来解析JSON。
我的模型类将是这样的:
MResponse.class
public class MResponse { @SerializedName("data") public User user; String metadata; }
User.class
public class User { public String name; public String pid; @SerializedName("position") public PositionData positionData; }
PositionData.class
public class PositionData { @SerializedName("data") public Position position; public String metadata; }
Position.class
public class Position { public String x; public String y; }
现在这对我来说工作得很好。 但正如你所看到的每一个模型,我必须创建一个父母,将有相同的结构只是改变了孩子。 这个事实使我用于模型的类倍增。 我想问一下,是否有更好的方法来避免所有这些类。
我不想使用内部类。 我在想,这样做过JSON的人肯定有这样一个理由,为什么他们这样做,也是一种使解析更容易的方法。
通常我被用来解析这种JSON结构:
{ "data": { "name": "Start", "pid": "1", "position": { "x": "31", "y": "330" } } }
如果我遵循上面的解决方案,这里更容易。
编辑
Kotlin也欢迎任何解决方案
编辑2
Kotlin解决方案在这里
我不认为你的要求是可能的。 如果有一个解决方案,那么它只会创建中间类,这将与您所做的几乎相同。
在Kotlin,我会这样做。 随意甚至把它放在一个.kt
文件中:
data class MResponse(@SerializedName("data") val user: User, val metadata: String) data class User(val name: String, val pid: String, @SerializedName("position") val positionData: PositionData) data class PositionData(@SerializedName("position") val position: Position, val metadata: String) data class Position(val x: String, val y: String)
那么我所要求的解决办法很简单,在我看来,我一开始就不知道。
根据Retrofit
源代码和一些其他有关Java generics
相关答案,这是我的问题的答案:
public class DataResponse<T, R> { public T data; @SerializedName("meta") public R metadata; }
这是我如何使用它的一个例子:
Observable<DataResponse<User, BaseMeta>> getUser()
对我来说,这是解决方案。 如果有更好的解决方案,我愿意接受他们。