Объект JS для быстрой конструкции - PullRequest
1 голос
/ 01 апреля 2019

У меня проблемы с синтаксическим анализом данных (как в JSON, которые я получаю из конечной точки) в структуры Swift.Кажется, что данные, которые я получаю от конечной точки, не являются допустимым JSON (по крайней мере, не все они смотрят на структуру object = (...) ), поэтому я не могу декодировать ListStruct,

Должен ли я разобрать это по-другому?Любой совет, который высоко ценится

Подготовленные мной структуры:

struct Response:Codable {
    let message:String?
    let list:ListStruct?
    let error:Bool?
}

struct ListStruct:Codable {
    let object1:[Object1]?
    let object2:[Object2]?
    let object3:[Object3]?
}

struct Object1:Codable {
id:Int?
name:String?
}
...

Пример данных, которые я получаю от конечной точки:

["message": <null>, "list": {
    object1 =     (
                {
            id = 1;
            name = "testing1";
        }
    );
    object2 =     (
                {
            files =             (
            );
            id = 1;
            name = "testing2-1";
            photos =             (
            );
        },
                {
            files =             (
            );
            id = 2;
            name = "testing2-2";
            photos =             (
            );
            systemId = 8;
        }
    );
    object3 =     (
                {
            id = 6;
            name = "testing3-1";
        },
                {

            id = 13;
            name = "testing3-2";
        }
    );
}, "error": 0]

РЕДАКТИРОВАТЬ

Как я пытаюсь сделать декодирование:

if let result = try JSONDecoder().decode(Response?.self, from: "\(response!)".data(using: .utf8)! ) {
                        print("\(result)")
                    }

Ошибка, которую я получаю:

Error: dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.", underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "No string key for value in object around character 6." UserInfo={NSDebugDescription=No string key for value in object around character 6.})))

1 Ответ

2 голосов
/ 01 апреля 2019

Скорее всего, вы передаете неправильный объект данных, создавая с использованием строковой интерполяции.Если тип response равен Data, вам не нужно заново создавать его в следующей строке:

if let result = try JSONDecoder().decode(Response?.self, from: "\(response!)".data(using: .utf8)! ) {

Попробуйте передать response как есть.Ниже показано,

if let result = try JSONDecoder().decode(Response?.self, from: response!) {

Вот полный тестируемый пример, в котором правильный объект данных создается с использованием рассматриваемого json, а тип error в Response изменяется с OptionalBool до Int,

struct Response:Codable {
    let message:String?
    let list:ListStruct?
    let error: Int?
}

struct ListStruct: Codable {
    let object1:[Object1]?
    let object2:[Object2]?
    let object3:[Object3]?
}

struct Object1: Codable {
    var id:Int?
    var name:String?
}

struct Object2: Codable {
    var id:Int?
    var name:String?
    var systemId: Int?
}

struct Object3: Codable {
    var id:Int?
    var name:String?
}

Использование:

let data = """
{"message": null,

"list": {
"object1": [
{
"id": 1,
"name": "testing1"
}
],
"object2" :     [
{
"files" :             [
],
"id" : 1,
"name" : "testing2-1",
"photos" :             [
]
},
{
"files" :            [
],
"id" : 2,
"name" : "testing2-2",
"photos" :             [
],
"systemId" : 8
}
],
"object3" :     [
{
"id" : 6,
"name" : "testing3-1",
},
{

"id" : 13,
"name" : "testing3-2",
}
]
},

"error": 0
}
""".data(using: .utf8)!

if let result = try! JSONDecoder().decode(Response?.self, from: data) {
        result.list?.object1?.forEach({ obj in
            print(obj.name)
        })
        result.list?.object2?.forEach({ obj in
            print(obj.name)
        })
        result.list?.object3?.forEach({ obj in
            print(obj.name)
        })
}

Выход:

Optional("testing1")
Optional("testing2-1")
Optional("testing2-2")
Optional("testing3-1")
Optional("testing3-2")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...