Ios 减少或Flatmap json对单个数组的响应
我有一个json响应消息体,如下所示。就我的UI而言,顶级消息只是列表中的第一条消息Ios 减少或Flatmap json对单个数组的响应,ios,swift,rx-swift,Ios,Swift,Rx Swift,我有一个json响应消息体,如下所示。就我的UI而言,顶级消息只是列表中的第一条消息 { "messageId": "1234-1234-1234", "jobId": "1234-1234-1234", "message": "This is the top level message", "createdDate": "2019-03-18T14:55:21.467", "user": {}, "messages": [{
{
"messageId": "1234-1234-1234",
"jobId": "1234-1234-1234",
"message": "This is the top level message",
"createdDate": "2019-03-18T14:55:21.467",
"user": {},
"messages": [{
"messageId": "1234-1234-1234",
"jobId": "1234-1234-1234",
"message": "This is the a child message",
"createdDate": "2019-03-18T14:55:21.467",
"user": {},
"messages": [],
"attachments": []
},
{
"messageId": "1234-1234-1234",
"jobId": "1234-1234-1234",
"message": "This is the another child message",
"createdDate": "2019-03-18T14:55:21.467",
"user": {},
"messages": [],
"attachments": []
},
{
"messageId": "1234-1234-1234",
"jobId": "1234-1234-1234",
"message": "This is the yet another child message",
"createdDate": "2019-03-18T14:55:21.467",
"user": {},
"messages": [],
"attachments": []
}
],
"attachments": []
}
服务器实体
struct MessageServer: Codable {
let messageId: String
let jobId: String
let message: String
let createdDate: Date
let user: User
let messages: [MessageServer]
let attachments: [FileServer]
init(messageId: String,
jobId: String,
message: String,
createdDate: Date,
user: User,
messages: [MessageServer],
attachments: [FileServer]
) {
self.messageId = messageId
self.jobId = jobId
self.message = message
self.createdDate = createdDate
self.user = user
self.messages = messages
self.attachments = attachments
}
}
应用实体
struct Message: Codable {
let message: String
let createdDate: Date
let displayName: String
let isMine: Bool
let attachments: [File]
init(message: String, createdDate: Date, displayName: String, isMine: Bool, attachments: [File]) {
self.message = message
self.createdDate = createdDate
self.displayName = displayName
self.isMine = isMine
self.attachments = attachments
}
}
在我的服务调用中,我只想返回一个可观察的消息数组
func getMessages(sectionID id: String) -> Observable<[Message]> {
return messageServiceEndpoints
.getMessages(for: id)
.map({
$0.map({
Message( /* init message here */ )
})
})
}
func getMessages(sectionID:String)->可观察{
返回消息ServiceEndpoints
.getMessages(用于:id)
.地图({
$0.05地图({
消息(/*此处初始化消息*/)
})
})
}
有没有一种方法可以将其缩减或平面映射到单个阵列 这不是一个真正的RxSwift问题。。。您只需要解析JSON:
struct Message: Decodable {
let messageId: String
let message: String
let createdDate: Date
private (set) var messages: [Message]
// and the rest...
var droppedMessages: Message {
var result = self
result.messages = []
return self
}
}
func parseMessages(from data: Data) throws -> [Message] {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyy-MM-dd'T'HH:mm:ss.SSS"
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(dateFormatter)
let response = try decoder.decode(Message.self, from: data)
return [response.droppedMessages] + response.messages
}
我目前通过将此方法添加到我的服务器实体来解决此问题
/// Creates a single list of [MessageServer] with the parent message at index 0
func flattenMessages() -> [MessageServer] {
var tmpMessages: [MessageServer] = []
let parent = MessageServer(messageId: messageId
jobId: jobId
message: message
createdDate: createdDate
user: user
messages: messages
attachments: attachments)
tmpMessages.append(parent)
return tmpMessages + messages
}
在我的服务呼叫中获取消息
func getMessages(sectionID id: String) -> Observable<[Message]> {
return laborServiceEndpoints
.getLaborOrderMessages(for: id)
.map({
$0.flattenMessages().map({
Message(message: $0.message,
createdDate: $0.createdDate,
displayName: $0.user.displayName
isMine: $0.user.id == userId,
attachments: $0.attachments.map({ File(name: $0.title,
type: DocumentType(rawString: $0.fileType),
url: $0.url)
})
)
})
})
}
func getMessages(sectionID:String)->可观察{
返回服务端点
.getLaborOrderMessages(用于:id)
.地图({
$0.plantMessages().map({
消息(消息:$0.5),
createdDate:$0.createdDate,
displayName:$0.user.displayName
isMine:$0.user.id==userId,
附件:$0.attachments.map({文件名:$0.title,
类型:DocumentType(原始字符串:$0.fileType),
url:$0.url)
})
)
})
})
}
不确定RX,但在map关闭后,您可以使用。flatMap{$0}可能会有帮助。对不起,我想我只是因为包含了JSON响应而把事情弄糊涂了。我已经将响应解析为MessageServer obj。我的目标是让我的服务调用获取该可观察对象并将其映射为可观察对象。我已经更新了我的问题,包括我的服务器和应用实体,并发布了我当前解决方案的答案。如果你能找到更好的方法,我会很感激你的意见。感谢此解决方案直接从JSON数据生成您请求的结果。你的答案似乎是做同样事情的更复杂的方式。