JSON错误:数据无法’;因为它是’;格式正确
因此,我试图调用后端api来获取horse类型的对象,我获取数据中的对象,但当我尝试解码它时,它不起作用。我怎样才能解决这个问题?您可以看到我的消息模型和我的马模型。我试图找出它们和json之间的区别,但我找不到 消息模型JSON错误:数据无法’;因为它是’;格式正确,json,swift,Json,Swift,因此,我试图调用后端api来获取horse类型的对象,我获取数据中的对象,但当我尝试解码它时,它不起作用。我怎样才能解决这个问题?您可以看到我的消息模型和我的马模型。我试图找出它们和json之间的区别,但我找不到 消息模型 // // MessageType.swift // HorseStable // // Created by Student on 30/12/2019. // Copyright © 2019 smartmobile. All rights reserved.
//
// MessageType.swift
// HorseStable
//
// Created by Student on 30/12/2019.
// Copyright © 2019 smartmobile. All rights reserved.
//
import Foundation
enum MessageType : Int,Decodable {
case CREATE_HORSE
case GET_HORSE
case UPDATE_HORSE
case DELETE_HORSE
case GET_HORSES_ASSIGNED_TO_USER
case REMOVE_HORSE_FROM_USER
case ADD_HORSE_TO_USER
/* USERS */
case CREATE_USER
case GET_USER
case UPDATE_USER
case DELETE_USER
/* FACILITIES */
case CREATE_FACILITY
case GET_FACILITY
case UPDATE_FACILITY
case DELETE_FACILITY
/* STALLS */
case CREATE_STALL
case GET_STALL
case UPDATE_STALL
case DELETE_STALL
/* POSTS */
case CREATE_POST
case GET_POST
case UPDATE_POST
case DELETE_POST
case ADD_RESERVATION
case REMOVE_RESERVATION
case AUTHENTICATE
}
public class Message<T: Decodable> : Decodable {
var type: MessageType?
var model : T?
init(type:MessageType,model:T) {
self.type = type
self.model = model
}
以下是我的JSON响应:
{"type":"GET_HORSE","model":{"id":1,"name":"Horse2","race":"Race2","lifeNumber":"lifenumber2","chipNumber":"chipnumber2","birthDate":1579182813067,"gender":"MALE","medicalReports":[],"owners":[]}}
这是密码
func getJSON (completion: @escaping (Message<Horse>)->()) {
let url = "http://localhost:8083/horse/1"
if let url = URL(string: url)
{
let task = session.dataTask(with: url) { data, response, error in
if error != nil || data == nil {
print("Client error!")
return
}
let str = String(decoding: data!, as: UTF8.self)
print(str)
do {
let decoder = JSONDecoder()
print("nothing")
if let json = try? decoder.decode(Message<Horse>.self, from: data!) {
print(json)
print("something")
}
} catch {
print("JSON error: \(error.localizedDescription)")
}
}
task.resume()
print("finished")
}
您的MessageType是一个Int,但在JSON中它似乎是一个字符串。你的性别类型可能也有类似的问题(这里没有包括)。您的生日字段是日期,但在JSON中是Int
仔细检查您的模型,确保它确实与您的JSON匹配。打印
错误
(而不是错误.localizedDescription
)应该可以准确地告诉您它在哪里遇到问题。我建议在操场上尝试使用响应JSON和解析器(去掉网络代码)。您的消息类型是一个Int,但在JSON中它似乎是一个字符串。你的性别类型可能也有类似的问题(这里没有包括)。您的生日字段是日期,但在JSON中是Int
仔细检查您的模型,确保它确实与您的JSON匹配。打印
错误
(而不是错误.localizedDescription
)应该可以准确地告诉您它在哪里遇到问题。我建议在操场上只使用响应JSON和解析器进行实验(去掉网络代码)。您应该删除if let JSON=try。。。用它来代替只是尝试。。。由于您处于do catch块中,您将至少收到一条错误消息,您的错误来自何处,错误消息是怎么说的?为了帮助您,这一点很重要。您已经显示了除实际错误之外的所有内容:请也添加它=)我刚刚将错误添加到问题中,我投票将此问题作为离题题结束,因为已经使用其他帐户询问了此问题,您应该删除if let json=try。。。用它来代替只是尝试。。。由于您处于do catch块中,您将至少收到一条错误消息,您的错误来自何处,错误消息是怎么说的?为了帮助您,这一点很重要。您已经显示了除实际错误之外的所有内容:也请添加它=)我刚刚将错误添加到问题中我投票将此问题作为离题题结束,因为已使用其他帐户进行了提问,
func getJSON (completion: @escaping (Message<Horse>)->()) {
let url = "http://localhost:8083/horse/1"
if let url = URL(string: url)
{
let task = session.dataTask(with: url) { data, response, error in
if error != nil || data == nil {
print("Client error!")
return
}
let str = String(decoding: data!, as: UTF8.self)
print(str)
do {
let decoder = JSONDecoder()
print("nothing")
if let json = try? decoder.decode(Message<Horse>.self, from: data!) {
print(json)
print("something")
}
} catch {
print("JSON error: \(error.localizedDescription)")
}
}
task.resume()
print("finished")
}
JSON error: The data couldn’t be read because it isn’t in the correct format