Could not parse request body into json: Unrecognized token 'xxx': was expecting ('true', 'false' or

在调用AWS Lambda函数时遇到InvalidRequestContentException,原因是请求体不能解析为JSON。错误提示'Unrecognized token...',解决方案是确保输入的JSON字符串正确包含双引号。文中还提及Python使用requests库时的类似问题,需检查POST数据的格式是否符合JSON标准。

调用 Lambda 函数时你可能遇到以下错误:

==================== INVOCATION ERROR ====================

com.amazonaws.services.lambda.model.InvalidRequestContentException: Could not parse request body into json: Unrecognized token 'first': was expecting 'null', 'true', 'false' or NaN

 at [Source: [B@1bc84b8d; line: 1, column: 7] (Service: AWSLambda; Status Code: 400; Error Code: InvalidRequestContentException; Request ID: 946370eb-33cc-11e8-ada5-xxxxxxxxxxx)


这是因为在调用时输入的参数格式不对!

输入的JSON字符串需要添加双引号


调用成功可以看到以下控制台输出:

Skip uploading function code since no local change is found...

Invoking function...

==================== FUNCTION OUTPUT ====================

"Hello, first lambda!"

==================== FUNCTION LOG OUTPUT ====================

START RequestId: fddbb722-33cc-11e8-8d29-xxxxxxx Version: $LATEST

Input: first lambdaEND RequestId: fddbb722-33cc-11e8-8d29-xxxxxxxxxxx

REPORT RequestId: fddbb722-33cc-11e8-8d29-xxxxxxxxx Duration: 18.62 ms Billed Duration: 100 ms Memory Size: 256 MB Max Memory Used: 43 MB


2018-07-12更新

有小伙伴使用Python时遇到类似的问题

  • s.headers.update(headers)
    result = s.post(url, data=data)

    python3 使用requests 去POS请求一个接口,结果服务器报错了

错误提示是JSON 解析错误,在post之前需要对字典进行处理吗?

原始的报错信息是这个

JSON parse error: Unrecognized token 'from': was expecting 'null', 'true', 'false' or NaN; nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'from': was expecting 'null', 'true', 'false' or NaN

我的回复:

result = s.post(url, data=data)

看看你提交的数据 data,格式是不是有问题

他:

  • {'size': 20, 'catalogueId': '473', 'from': 0}

很正常的一个dic呀

需要把dic转换一下,文档上面却没要求转

我:哪个文档?




### JSON 解析错误的常见原因与解决方法 在 Swift 中使用 Moya 时,若遇到 `JSON parse error: Unrecognized token 'email'` 类似错误,通常表示返回的 JSON 数据格式不正确或无法被解析。该问题可能由以下几种原因导致: 1. **服务器响应内容非标准 JSON 格式** 如果服务器返回的内容中包含非法字符、注释或未转义的关键字(如 `email`),会导致 JSON 解析失败。例如,如果响应中包含类似 `{"email": "user@example.com"}` 的结构,但某些情况下返回了 `email: user@example.com` 这样的非标准写法,则会触发此类错误。 2. **编码格式不匹配** 若响应数据未以 UTF-8 编码返回,或者请求未正确设置 `Accept` 和 `Content-Type` 头信息为 `application/json`,也可能导致解析异常。 3. **模型映射方式不兼容** 当使用 `Codable` 或 `HandyJSON` 进行模型映射时,若字段名称与 JSON 键名不一致、嵌套结构未正确处理或可选字段未标注为 `Optional`,也会造成解析失败。 4. **网络请求返回了 HTML 页面而非 JSON 数据** 在开发过程中,若 API 路径配置错误或服务器发生重定向,可能导致返回的是登录页或其他 HTML 内容,而非预期的 JSON 数据。此时尝试将其解析为 JSON 将失败。 --- ### 示例代码:Moya 结合 Codable 解析 JSON 响应 ```swift struct UserResponse: Codable { let email: String let name: String } let provider = MoyaProvider<AuthService>() provider.request(.login(email: "test@example.com", password: "123456")) { result in switch result { case let .success(response): do { let user = try response.map(UserResponse.self) print("User Email: $user.email)") } catch { print("Error decoding JSON: $error)") } case let .failure(error): print("Request failed: $error)") } } ``` 上述代码展示了如何通过 `Codable` 协议将 Moya 返回的 JSON 数据解析为 `UserResponse` 模型。若解析失败并提示 `Unrecognized token 'email'`,则需检查响应内容是否符合 JSON 格式规范[^1]。 --- ### 解决方案建议 1. **打印原始响应内容进行验证** 在调试阶段,可以先打印出原始响应数据,确认其是否为合法的 JSON 字符串。例如: ```swift let responseBody = String(data: response.data, encoding: .utf8) print("Raw Response: $responseBody ?? "")") ``` 若输出中存在 `html` 标签、乱码或非法键值对,则说明后端返回的数据不符合预期,需调整请求参数或联系服务端排查问题[^3]。 2. **使用 SwiftyJSONJSONSerialization 手动解析** 若模型较为复杂或需要更灵活的解析逻辑,可借助 `SwiftyJSON` 或原生 `JSONSerialization` 对响应数据进行手动解析,并逐层提取所需字段: ```swift do { let json = try JSONSerialization.jsonObject(with: response.data, options: []) if let dict = json as? [String: Any], let email = dict["email"] as? String { print("Email: $email)") } } catch { print("Failed to parse JSON: $error)") } ``` 3. **确保模型字段与 JSON 键匹配** 使用 `Codable` 时,若 JSON 键与模型属性名称不一致,可通过 `CodingKeys` 枚举显式映射: ```swift struct UserResponse: Codable { let email: String let fullName: String enum CodingKeys: String, CodingKey { case email case fullName = "name" } } ``` 4. **检查网络请求路径和 HTTP 方法是否正确** 若出现 `400` 或 `405` 状态码,通常表示请求路径错误或方法不被允许。需再次核对 `TargetType` 中定义的 `path` 和 `method` 是否与后端接口文档一致[^2]。 5. **统一设置 Accept 和 Content-Type 请求头** 在 `TargetType` 中添加 `.accept("application/json")` 和 `.contentType("application/json")` 可确保客户端与服务端就数据格式达成一致: ```swift var headers: [String: String]? { return [ "Accept": "application/json", "Content-Type": "application/json" ] } ``` --- ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值