在 Swift 中使用 POST 方法接收 JSON 时遇到错误
2018-5-6 15:30:13
收藏:0
阅读:78
评论:1
我正在向后端发送 POST 请求,但是我遇到了这个错误:
The given data was not valid JSON.",
underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840
"JSON text did not start with array or object and option to allow
fragments not set."
UserInfo={NSDebugDescription=JSON text did not start with array
or object and option to allow fragments not set.})))
这是我用来发送/获取数据的代码:
func fetchDataWithParameters(){
struct Response: Codable {
let status: String?
let error: String?
}
let decoder = JSONDecoder()
HTTP.POST("somelinkhere", parameters: ["date": self.weekDays[self.itemSelectedIndex]]) { response in
if let error = response.error {
print("got an error: \(error)")
return
}
do {
let resp = try decoder.decode(Response.self, from: response.data)
if let err = resp.error {
print("got an error: \(err)")
}
if let status = resp.status {
print("completed: \(status)")
}
} catch let error {
print("decode json error: \(error)")
}
}
}
我在终端中尝试手动发送 POST 请求,得到了这个结果:
Admins-MacBook-Pro:hello-world admin$ curl -i -H "Accept: application/json" -H "Content-Type: application/json" somelinkhere
HTTP/1.1 200 OK
Server: openresty/1.9.15.1
Date: Thu, 03 May 2018 23:42:04 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 39
Connection: keep-alive
X-Clacks-Overhead: GNU Terry Pratchett
"{\"name\": \"Timo\", \"age\": \"39\"}"
这让我想到唯一可能的错误就是我解码 JSON 的方式不正确。否则为什么会在终端下起作用?有什么想法吗?
如 @patru 建议的一样,我在这里包含了 print:
catch let error {
print(String(data:response.data, encoding: .utf8)!)
print("decode json error: \(error)")
}
这是结果:
"{\"name\": \"Mergim\", \"age\": \"39\"}"
decode json error: dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.", underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.})))
虽然我使用 curl 得到的是 JSON,但是对于某些原因,Swift 认为这不是有效的 JSON?这是我的后端 post 方法的代码:
@app.route('/', methods=['GET', 'POST'])
def index():
jsonData = {"name": "Timo", "age": "39"}
jsonData1 = {"name": "Mergim", "age": "39"}
if request.method=='GET':
return json.dumps(jsonData)
elif request.method=='POST':
return json.dumps(jsonData1)
编辑
jsonData = '{"name": "Timo", "age": "39"}'
jsonData1 = '{"name": "Mergim", "age": "39"}'
更改为:
jsonData = {"name": "Timo", "age": "39"}
jsonData1 = {"name": "Mergim", "age": "39"}
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

这很微妙,但是,信不信由你,问题在于 服务器 上!
实际上,你的代码看起来...有点奇怪,但还是相当不错的,所以我运行了这个 Playground:
import Cocoa let jsonData = "{\"name\": \"Mergim\", \"age\": \"39\"}".data(using: .utf8)! struct Response: Codable { let status: String? let error: String? } struct NameAge: Codable { let name: String let age: String } do { let resp = try JSONDecoder().decode(Response.self, from: jsonData) print(resp) let na = try JSONDecoder().decode(NameAge.self, from: jsonData) print(na) } catch { print(error) } print(String(data:jsonData, encoding: .utf8)!)由于你的
Response结构体并不完全符合你数据的结构,我实现了NameAge以获得更合适的结果。尽管Response的值仍有问题,但两者仍然都可以解析。我也很困惑,直到我看了看你的错误消息:它抱怨了你数据中的第一个字符!当我在 Playground 中添加了最后一行时,问题就变得明显了。你向服务器提供了一个有效的
String对象,它将其转换为相应的 JSON,仍然表示 JSON 中的 _仅为字符串_。这解释了你手头的双引号,我的 Playground 并不会产生。你可能应该将你的jsonData提供为Hash,这样服务器就可以正确转换它(无双引号)。由于某种原因,JSONDecoder不想解码简单的 JSON 字符串,但我对此表示谅解。顺便说一句:一旦你能正确传递参数,你可能想把
age的类型改为Int。