我似乎无法了解如何在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的新手......
答案 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
。在您的情况下,它将是name
和exportType
:
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!)