更新结构中的特定值

时间:2018-05-08 19:22:08

标签: json swift structure codable

我似乎无法了解如何在Swift 4中更新结构中的特定值。我有这样的结构:

struct Export: Decodable {
    let id: String
    let name: String
    let exportType: String
}

它充满了我从JSON获得的值 我正在使用JSONDecoder

self.Exp = try JSONDecoder().decode([Export].self, from: data!)

现在我收到一个只包含id的新JSON 我想用新值更新此结构的id JSON发送类似的响应:

{
    "id": "70CD044D290945BF82F13C13B183F669"
}

因此,即使我尝试将其保存在单独的结构中,也会出现此错误

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.})))

我在发布之前试图寻找解决方案,但我找不到任何我对JSON处理和Swift的新手......

2 个答案:

答案 0 :(得分:1)

将JSON部分放在一边,您将无法更新id中的Export,因为它是let常量。您可能希望将其更改为var

如果我理解正确,您将收到一个只有 ID的JSON回复。您不会从中创建Export结构。您需要单独处理此JSON响应以获取您要查找的ID。像这样:

import Foundation

let jsonText = """
{"id": "70CD044D290945BF82F13C13B183F669"}
"""

struct IdResponse: Codable {
    let id: String
}

let idResponse: IdResponse = try! JSONDecoder().decode(IdResponse.self, from: jsonText.data(using: .utf8)!)

最后,更新您的Export结构:

import Foundation

struct Export: Decodable {
    var id: String
    let name: String
    let exportType: String
}

// Build export object
var export: Export = Export(id: "1", name: "Name", exportType: "TypeA")

// Grab JSON response from somewhere, which contains an updated id
let idResponse: IdResponse = try! JSONDecoder().decode(IdResponse.self, from: jsonText.data(using: .utf8)!)

// Update the object
export.id = idResponse.id

答案 1 :(得分:0)

首先,所有JSON的格式都不正确。

其次,在您收到正确的JSON后,self.Exp您将获得数组,但对于您的idDict,您只有一个字典对象。

所以,保留那些不必出现在JSON中的属性optional。在您的情况下,它将是nameexportType

struct Export: Decodable {
    var id: String
    var name: String?
    var exportType: String?
}

它可以用作self.Exp

self.Exp = try JSONDecoder().decode([Export].self, from: data!)

idDict为:,

idDict = try JSONDecoder().decode(Export.self, from: data!)