尝试发送 [JSON] 作为 Moya 中的参数值时出错
getting error when trying to send [JSON] as parameter value in Moya
我正在尝试 post 一个 http 请求,我必须处理嵌套 json。
我尝试将我的参数发送为
[[String: Any]]
和
[JSON]
,但我在这两种情况下都出错。
这是我的代码:
var accountTitlesForNewProject = [JSON]()
for indexCounter in 0 ..< self.accountTitles.count {
let _accountTitle = self.accountTitles[indexCounter]
if !isChecked[indexCounter] {
continue
}
var _accountTitleJSON = JSON()
_accountTitleJSON["name"] = _accountTitle["name"]
_accountTitleJSON["description"] = _accountTitle["description"]
var _codes = [JSON]()
for (_, _code) in _accountTitle["accounting_codes"] {
let _codeJSON = JSON(dictionaryLiteral: ("type", _code["type"]), ("code", _code["code"]), ("level", _code["level"]))
_codes.append(_codeJSON)
}
_accountTitleJSON["accounting_codes"] = JSON(_codes)
accountTitlesForNewProject.append(_accountTitleJSON)
}
print(accountTitlesForNewProject)
self.addProject(projectName: projectName, stateId: stateId, cityId: cityId, accountTitles: accountTitlesForNewProject, successHandler: successHandler)
这是打印的结果:
[{"accounting_codes" : [
{"level" : 1,
"type" : 1,
"code" : "694"
},
{"level" : 2,
"type" : 1,
"code" : "312"
},
{"level" : 3,
"type" : 1,
"code" : "336"
}],
"name" : "بنفشه صفوی",
"description" : "لابد حرف و سخنی و خندهای و رفت. کنهای بود. درست یک پیرمرد. یک ساعت به ماهی سه چهار هفته بیشتر دوام نکرد.."
},
{"accounting_codes" : [
{"level" : 1,
"type" : 1,
"code" : "977"
},
{"level" : 2,
"type" : 1,
"code" : "568"
},
{"level" : 3,
"type" : 1,
"code" : "178"
}],
"name" : "آزاده میرزاده",
"description" : "و دیگه خسته شدهام. دلم میخواد قضیه به همین سادگی تمام میشود. و بعد چند سال سابقه دارد و چند نفری از اولیای."
}]
这是出现问题的 addProject 函数:
private func addProject(projectName: String, stateId: Int, cityId: Int, accountTitles: [JSON], successHandler: @escaping (String) -> ()) {
let authenticator: TGAccessTokenProvider = TGOpenAuthentication.getTGOpenAuthenticator()
authenticator.getAccessToken(successHandler: { (_accessToken) in
self.projectProvider.request(.store(accessToken: _accessToken, projectName: projectName, stateId: stateId, cityId: cityId, accountTitles: accountTitles), completion: { ...
}
我在执行 self.projectProvider.request 时出错,这是错误消息:
"Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (_SwiftValue)'"
有什么问题?
如前所述,我这样解决了我的问题,因为我的对象属性定义为:
private var accountTitles = [JSON]()
所以这是工作代码:
var accountTitlesForNewProject = [Any]()
for indexCounter in 0 ..< self.accountTitles.count {
let _accountTitle = self.accountTitles[indexCounter]
if !isChecked[indexCounter] {
continue
}
var _codes = [Any]()
for (_, _code) in _accountTitle["accounting_codes"] {
let _codeJSON: [String: Any] = ["type": _code["type"].intValue,
"code": _code["code"].stringValue,
"level": _code["level"].intValue]
_codes.append(_codeJSON)
}
let _accountTitleJSON: [String: Any] = ["name": _accountTitle["name"].stringValue,
"description": _accountTitle["description"].stringValue,
"accounting_codes": _codes]
accountTitlesForNewProject.append(_accountTitleJSON)
}
我正在尝试 post 一个 http 请求,我必须处理嵌套 json。
我尝试将我的参数发送为
[[String: Any]]
和
[JSON]
,但我在这两种情况下都出错。
这是我的代码:
var accountTitlesForNewProject = [JSON]()
for indexCounter in 0 ..< self.accountTitles.count {
let _accountTitle = self.accountTitles[indexCounter]
if !isChecked[indexCounter] {
continue
}
var _accountTitleJSON = JSON()
_accountTitleJSON["name"] = _accountTitle["name"]
_accountTitleJSON["description"] = _accountTitle["description"]
var _codes = [JSON]()
for (_, _code) in _accountTitle["accounting_codes"] {
let _codeJSON = JSON(dictionaryLiteral: ("type", _code["type"]), ("code", _code["code"]), ("level", _code["level"]))
_codes.append(_codeJSON)
}
_accountTitleJSON["accounting_codes"] = JSON(_codes)
accountTitlesForNewProject.append(_accountTitleJSON)
}
print(accountTitlesForNewProject)
self.addProject(projectName: projectName, stateId: stateId, cityId: cityId, accountTitles: accountTitlesForNewProject, successHandler: successHandler)
这是打印的结果:
[{"accounting_codes" : [
{"level" : 1,
"type" : 1,
"code" : "694"
},
{"level" : 2,
"type" : 1,
"code" : "312"
},
{"level" : 3,
"type" : 1,
"code" : "336"
}],
"name" : "بنفشه صفوی",
"description" : "لابد حرف و سخنی و خندهای و رفت. کنهای بود. درست یک پیرمرد. یک ساعت به ماهی سه چهار هفته بیشتر دوام نکرد.."
},
{"accounting_codes" : [
{"level" : 1,
"type" : 1,
"code" : "977"
},
{"level" : 2,
"type" : 1,
"code" : "568"
},
{"level" : 3,
"type" : 1,
"code" : "178"
}],
"name" : "آزاده میرزاده",
"description" : "و دیگه خسته شدهام. دلم میخواد قضیه به همین سادگی تمام میشود. و بعد چند سال سابقه دارد و چند نفری از اولیای."
}]
这是出现问题的 addProject 函数:
private func addProject(projectName: String, stateId: Int, cityId: Int, accountTitles: [JSON], successHandler: @escaping (String) -> ()) {
let authenticator: TGAccessTokenProvider = TGOpenAuthentication.getTGOpenAuthenticator()
authenticator.getAccessToken(successHandler: { (_accessToken) in
self.projectProvider.request(.store(accessToken: _accessToken, projectName: projectName, stateId: stateId, cityId: cityId, accountTitles: accountTitles), completion: { ...
}
我在执行 self.projectProvider.request 时出错,这是错误消息:
"Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (_SwiftValue)'"
有什么问题?
如前所述
private var accountTitles = [JSON]()
所以这是工作代码:
var accountTitlesForNewProject = [Any]()
for indexCounter in 0 ..< self.accountTitles.count {
let _accountTitle = self.accountTitles[indexCounter]
if !isChecked[indexCounter] {
continue
}
var _codes = [Any]()
for (_, _code) in _accountTitle["accounting_codes"] {
let _codeJSON: [String: Any] = ["type": _code["type"].intValue,
"code": _code["code"].stringValue,
"level": _code["level"].intValue]
_codes.append(_codeJSON)
}
let _accountTitleJSON: [String: Any] = ["name": _accountTitle["name"].stringValue,
"description": _accountTitle["description"].stringValue,
"accounting_codes": _codes]
accountTitlesForNewProject.append(_accountTitleJSON)
}