如何更改解析?
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 对象
但是,出于几个原因,我对此并不满意。
首先,我想为 containers
和 operations
使用 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
中访问存储库中的数据。
注意上面的例子只是为了演示。您可以根据需要定制代码。该示例表明您不受限于从远程源接收的数据的形式,并且您可以根据应用程序的需要设计模型。来自远程源的数据旨在有效地传输数据,而不一定是客户端应用程序需要它的方式。
以下是有助于更好理解的有用资源:
我有以下 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 或面向消息的中间件
但是,出于几个原因,我对此并不满意。
首先,我想为 containers
和 operations
使用 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
中访问存储库中的数据。
注意上面的例子只是为了演示。您可以根据需要定制代码。该示例表明您不受限于从远程源接收的数据的形式,并且您可以根据应用程序的需要设计模型。来自远程源的数据旨在有效地传输数据,而不一定是客户端应用程序需要它的方式。
以下是有助于更好理解的有用资源: