Swift - вложенный массив json, не возвращающий значение - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь получить массив из «импорта» из файла JSON, но массив возвращается закодированным.

[ServerName.JSONNodeValue, ServerName.JSONNodeValue, ServerName.JSONNodeValue, ServerName.JSONNodeValue, ServerName.JSONNodeValue, ServerName.JSONNodeValue]

Я знаю, что данные можно увидеть так, как будто я печатаю значение данных в файле JSONNode, оно выглядит как https://servername.com/storage/sessions/00167/imports ( "Movie1.mov", "Movie3.mov", "Movie2.mov", "._Movie1.mov", "._Movie2.mov", "._Movie3.mov" )

Это не мой код, а причина, по которой я борюсь, потому что я все еще довольно новичок в стремительности.

Мой файл JSON выглядит примерно так:

{
 "id": 135
 "name": Test
 "angles" [
{
 "id": 35,
 "name": "test",
 "mp4": "http:/0.0.0:3000/storage/seesion/00138/url.mp4"
}
 ]
 "imports" [
  movie1.mp4,
  movie2.mp4,
  movie3.mp4
 ]
}

Swift Code - файл сессии

struct Session {
var id: Int
var name: String
var angles: [Angle] = []
var imports: [Any]

extension Session {
init(fromDict dict: [String: AnyObject]){
    let node = JSONNodeValue(dict)
    let sessionId = node["id"].int ?? 0
    self.id = sessionId
    self.name = node["name"].string ?? "???"
    print(name)
    self.imports = node["imports"].arrayOrEmpty
    self.angles = node["angles"].arrayOrEmpty.map { angleDict in
        Angle(fromDict: angleDict.object!)
    }

Файл JSONnode, который обрабатывает JSON

protocol JSONNode {
subscript(key: String) -> JSONNode { get }
var int: Int? { get }
var double: Double? { get }
var string: String? { get }
var bool: Bool? { get }
var date: Date? { get }
var array: [JSONNode]? { get }
var arrayOrEmpty: [JSONNode] { get }
var object: [String: Any]? { get }
var objectOrEmpty: [String: Any] { get }
}

class JSONNodeValue : JSONNode {
static func parse (_ data: Data) -> JSONNode {
    if let root = try? JSONSerialization.jsonObject(with: data) {
        return JSONNodeValue(root)
    } else {
        return JSONNodeNone.instance
    }
}

var value: Any

init(_ value: Any) {
    self.value = value
    print(value) // SHOWS THE DATA I NEED
}

subscript(key: String) -> JSONNode {
    if let object = value as? [String: Any], let subvalue = object[key] {
        return JSONNodeValue(subvalue)
    } else {
        return JSONNodeNone.instance
    }
}

var int: Int? {
    return value as? Int
}

var double: Double? {
    return value as? Double
}

var string: String? {
    return value as? String
}

var bool: Bool? {
    return value as? Bool
}

var date: Date? {
    if let formatted = string {
        return Date.fromIso8601(formatted)
    } else {
        return nil
    }
}

var array: [JSONNode]? {
    if let array = value as? [Any] {
        return array.map { JSONNodeValue($0) }
    } else {
        return nil
    }
}

var arrayOrEmpty: [JSONNode] {
    return array ?? []
}

var object: [String: Any]? {
    return value as? [String: Any]
}

var objectOrEmpty: [String : Any] {
    return object ?? [:]
}
}

Может ли кто-нибудь указать мне правильное направление или ответить на другие вопросы, которые могут помочь мне решить эту проблему? Спасибо

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Я решил, чего пытался добиться, добавив новую переменную в файл JSNODE, который затем дал мне ["movie1.mov", "movie3.mov", "movie2.mov", "._movie1.mov", "._movie2.mov", "._movie3.mov"]

var arrayList: [String]? {
        return value as? [String]
    }

Спасибо за помощь, хотя.

0 голосов
/ 14 сентября 2018

Структура выглядит хорошо, но удалите = [] после [Angle], но вы должны использовать протокол Codable для анализа JSON следующим образом:

struct Session: Codable {
var id: Int
var name: String
var angles: [Angle]
var imports_dir_contents: [Any] 

, затем создайте другую структуру, чтобы получитьУгол

struct Angle: Codable
let id: Int
let name: String
let mp4: String

Затем вы хотите выполнить синтаксический анализ с использованием метода протокола Codable, передав данные, полученные из сетевого вызова.

do {

     let newJSONDecoder = JSONDecoder()
     let session = try newJSONDecoder.decode(Session.self, from:data)

     let anglesArray = session.angles // or use whatever array property you want 


     } catch {
       print("error while parsing:\(error)")
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...