Обновить конкретное значение в структуре - PullRequest
0 голосов
/ 08 мая 2018

Я не могу выяснить, как обновить определенное значение в структуре в 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!)

Теперь я получаю новый JSON, содержащий только идентификатор.
Я хочу обновить идентификатор этой структуры с новым значением.
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 голосов
/ 08 мая 2018

Оставляя часть JSON в стороне, вы не сможете обновить id в Export, так как это константа let. Вы можете изменить его на var.

Если я правильно понимаю, вы получаете ответ JSON с только идентификатором. Вы не создаете Export структуру из этого. Вам нужно будет обработать этот ответ JSON отдельно, чтобы получить идентификатор, который вы ищете. Как это:

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
0 голосов
/ 08 мая 2018

Во-первых, всего вашего JSON не в правильном формате.

Во-вторых, после того, как вы получите правильный JSON, для self.Exp вы получаете массив, но для вашего idDict у вас есть только один объект словаря.

Итак, сохраните те свойства optional, которые не обязательно должны появляться в JSON. В вашем случае это будет 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!)
...