尝试在 Moya 中将 [JSON] 作为参数值发送时出错

Posted

技术标签:

【中文标题】尝试在 Moya 中将 [JSON] 作为参数值发送时出错【英文标题】:getting error when trying to send [JSON] as parameter value in Moya 【发布时间】:2018-12-26 16:56:04 【问题描述】:

我正在尝试发布一个 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 执行时出现错误,这是错误消息:

“由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'JSON写入中的类型无效(_SwiftValue)'”

有什么问题?

【问题讨论】:

【参考方案1】:

如here 所述,我通过这种方式解决了我的问题,因为我的对象属性定义为:

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)

【讨论】:

以上是关于尝试在 Moya 中将 [JSON] 作为参数值发送时出错的主要内容,如果未能解决你的问题,请参考以下文章

iOS Swift moya框架发送数组作为请求参数(GET/POST)

使用 Moya 处理缓存

如何阻止 MOYA/Alamfire 转义我的身体 json 参数?

如何使用 AFNetworking 在 http 中将 json 数据作为参数传递

在 Dart 中将类静态工厂作为方法参数传递

将 JSON 作为参数传递 swift