ios - swift parse json - 无法读取数据,因为它的格式不正确

标签 ios json swift alamofire jsondecoder

这是结构可编码代码:

import Foundation

public struct TaskID: Codable {
    let embedded: Embedded
}

public struct Embedded: Codable {
    let task: [Task]
}

public struct Task : Codable {

    let embedded: EmbeddedVariable
    let id : String
    let name: String
    let assignee: String
    let created: String
    let processDefinitionId: String
}

public struct EmbeddedVariable: Codable {

    let variable : [Variables]
}

public struct Variables: Codable {

    let value : String
    let name: String
}

我尝试过使用codingKey,也尝试过使用_embedded。面临同样的问题。

错误日志:由于错误而无法解码响应:

 Alamofire.AFError.
 ResponseSerializationFailureReason.decodingFailed(error: Swift.DecodingError.typeMismatch(Swift.Dictionary<Swift.String, Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Dictionary<String, Any> but found an array instead.", underlyingError: nil)))))

无法读取数据,因为格式不正确。

这是 JSONSerialization 的代码:

      // MARK: - URLRequestConvertible
func asURLRequest() throws -> URLRequest {
    let url = try K.ProductionServer.baseURL.asURL()
    
    var urlRequest = URLRequest(url: url.appendingPathComponent(path))
    print(urlRequest)
    // HTTP Method
    urlRequest.httpMethod = method.rawValue
   
    let authToken = UserDefaults.standard.string(forKey: "authToken")
    let bearerToken: String = "Bearer " + (authToken ?? "")
    print("baearer token::\(bearerToken)")
    
    // Common Headers
    urlRequest.setValue(ContentType.json.rawValue, forHTTPHeaderField: HTTPHeaderField.acceptType.rawValue)
    urlRequest.setValue(ContentType.json.rawValue, forHTTPHeaderField: HTTPHeaderField.contentType.rawValue)
    urlRequest.setValue(bearerToken, forHTTPHeaderField: HTTPHeaderField.authentication.rawValue)
    
    // Parameters
    if let parameters = parameters {
        do {
            urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: [])
        } catch {
            throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error))
        }
    }
    
    return urlRequest
}

以下是 json 返回响应的代码:

   import Foundation
  import Alamofire

public class APIClient {
@discardableResult
private static func performRequest<T:Decodable>(route:APIRouter, decoder: JSONDecoder = JSONDecoder(), completion:@escaping (AFResult<T>)->Void) -> DataRequest {
            
    return AF.request(route)
                    .responseDecodable (decoder: decoder){ (response: AFDataResponse<T>) in
                        completion(response.result)
                        print("framework response::",response.result)
    }
}

public static func taskID(id: String, completion:@escaping (AFResult<MyTaskData>)->Void) {
    
    performRequest(route: APIRouter.TaskById(id: id), completion: completion)
}


}//APIClient

最佳答案

在 JSON 负载中,processDefinitionId 键的值末尾有一个额外的逗号。

尝试使用此 JSON Formatter 工具来验证 JSON:jsonformatter

"task":[
        {
         //...

         "id": "412a2aca-06ae-11ea-8860-120ef5ab2c25",
         "name": "Quick Evaluation",
         "assignee": "demo",
         "created": "2019-11-14T07:13:27.558+0000",
         "processDefinitionId": "quickEvaluation:1:129ce2b1-0616-11ea-8860-120ef5ab2c25", // remove this coma(,) from this line

        }

更新:

使用CodingKey作为_embedded。尝试以下方法

// MARK: - TaskID
struct TaskID: Codable {
    let embedded: Embedded
    let count: Int

    enum CodingKeys: String, CodingKey {
        case embedded = "_embedded"
        case count
    }
}

// MARK: - Embedded
struct Embedded: Codable {
    let task: [Task]
}

// MARK: - Task
struct Task: Codable {
    let embedded: EmbeddedVariable
    let id, name, assignee, created: String
    let processDefinitionID: String

    enum CodingKeys: String, CodingKey {
        case embedded = "_embedded"
        case id, name, assignee, created
        case processDefinitionID = "processDefinitionId"
    }
}

// MARK: - EmbeddedVariable
struct EmbeddedVariable: Codable {
    let variable: [Variable]
}

// MARK: - Variable
struct Variable: Codable {
    let links: Links
    let name, value, type: String
    let valueInfo: ValueInfo

    enum CodingKeys: String, CodingKey {
        case links = "_links"
        case name, value, type, valueInfo
    }
}

// MARK: - Links
struct Links: Codable {
    let linksSelf: SelfClass

    enum CodingKeys: String, CodingKey {
        case linksSelf = "self"
    }
}

// MARK: - SelfClass
struct SelfClass: Codable {
    let href: String
}

// MARK: - ValueInfo
struct ValueInfo: Codable {
}

关于ios - swift parse json - 无法读取数据,因为它的格式不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58872760/

相关文章:

ios - UIPickerView iOS 11 滚动和选择错误

ios - 如何在视觉格式约束中告诉 tableviewcell 类标签名称?

ios - 文本字段应该更改范围内的字符,只有第一个正在执行

ios - 使用 NMAMapViewDelegate 识别标记选择?

arrays - 按类型过滤 Swift [AnyObject] 数组

ios - Swift - 如何在 SQLite 查询中捕获 nil 值?

javascript - Google Charts 动态数组 PHP 不带 SQL

javascript - 我正在从 javascript 传递表单数据中的 JSON。并在 php 中访问该 JSON。它将 ""替换为“

javascript - 将图像文件添加到 JSON 对象并以 HTML 显示?

ios - self.navigationController 返回 nil (Swift)