如何更改解析?

How to change the parsing?

我有以下 json :

{
"id":"123",
"nbElements":15,
"containers":[
  {
    "id":"cont1",
    "capacity":3
  }
],
"operations":[
  {
    "id":"cont1_01",
    "weight":3,
    "containerId":"cont1"
  },
  {
    "id":"cont1_02",
    "weight": 4, 
    "containerId":"cont1"
  }
]
}

我创建了以下 类:

data class Instance (
    val id: String,
    val nbElements: Long,
    val containers: List<Container>,
    val operations: List<Operation>
)

data class Container (
    val id: String,
    val capacity: Long
)

data class Operation (
    val id: String,
    val weight: Long,
    val containerId: String
)

我正在使用 Moshi 解析它

val adapter = Moshi.Builder().addLast(KotlinJsonAdapterFactory()).build().adapter<Instance>(Instance::class.java)`
val instance: Instance? = adapter.fromJson(request)

N.B request 这里只是 API 或面向消息的中间件

发送的 json 对象

但是,出于几个原因,我对此并不满意。

首先,我想为 containersoperations 使用 HashMap,其中键是标识符。因此,我将能够使用其密钥轻松访问操作对象。

其次,我想在每次操作中将容器存储为一个完整的对象。因此我可以做 operation.container.capacity

对改进我的代码有什么想法吗?

我的建议是为应用程序的不同层使用不同的模型。 例如:

远程模型:

data class InstanceRemoteModel (
    val id: String,
    val nbElements: Long,
    val containers: List<Container>,
    val operations: List<Operation>
)

data class ContainerRemoteModel (
    val id: String,
    val capacity: Long
)

data class OperationRemoteModel (
    val id: String,
    val weight: Long,
    val containerId: String
)

域模型:

data class Instance (
    val id: String,
    val elementCount: Long,
    val containers: Map<String, Container>,
    val operations: Map<String, Operation>
)

data class Container (
    val id: String,
    val capacity: Long
)

data class Operation (
    val id: String,
    val weight: Long,
    val container: Container
)

您可以有一个存储库层,您可以在其中将远程模型转换为领域模型。像这样:

class InstanceRepository(...) {
    suspend fun getInstance(...) : Instance {
        //Get data from Server
        //Map models using mapper classes/functions

        return instance
    }
}

现在,您可以在 ViewModel 中访问存储库中的数据。

注意上面的例子只是为了演示。您可以根据需要定制代码。该示例表明您不受限于从远程源接收的数据的形式,并且您可以根据应用程序的需要设计模型。来自远程源的数据旨在有效地传输数据,而不一定是客户端应用程序需要它的方式。

以下是有助于更好理解的有用资源:

  1. DTO
  2. Repository pattern
  3. Functional data mappers