Swift-JSON嵌套数组未返回值

时间:2018-09-14 02:28:21

标签: arrays json swift server nested

我正在尝试从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
 ]
}

快速代码-会话文件

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

处理JSON的JSONnode文件

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 :(得分:0)

该结构看起来不错,但是请在= []之后删除[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)")
     }

答案 1 :(得分:0)

我通过在JSNODE文件中添加一个新变量解决了我想要实现的目标,然后为我提供了[“ movie1.mov”,“ movie3.mov”,“ movie2.mov”,“ ._ movie1.mov” ,“ ._ movie2.mov”,“ ._ movie3.mov”]

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

不过感谢您的帮助。