我正在向我的后端发送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建议我在这里打印:
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"}
答案 0 :(得分:0)
这很微妙,不管你信不信,问题出在 Server 上!
实际上你的代码看起来有点偏,但仍然很好,所以我跑了这个游乐场:
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
的值仍然值得怀疑,但它们仍然都在进行解析。我也很困惑,直到我检查出你的错误信息:它抱怨你数据中的第一个字符!我终于在游乐场添加了最后一行,问题变得清晰了。
您使用有效的String
对象提供了您的服务器(我猜它是红宝石或其附近的东西),并将其转换为相应的JSON,仍然代表只是一个字符串在JSON中。这解释了你有的双引号和我的Playground不会产生的。您可能应该将jsonData
作为Hash
提供,服务器将正确转换它(不带双引号)。出于随机原因JSONDecoder
不想解码一个简单的JSON字符串,但这是我原谅的原因。
顺便说一句:您可能希望在正确传递后将age
的类型更改为Int
。