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() 

对我来说,这是解决方案。 如果有更好的解决方案,我愿意接受他们。