繁体   English   中英

Swift-JSON嵌套数组未返回值

[英]Swift - json nested array not returning value

我正在尝试从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代码-会话文件

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 ?? [:]
}
}

有人可以指出我正确的方向,还是其他可以帮助我解决此问题的已回答问题? 谢谢

该结构看起来不错,但是在[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)")
     }

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

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

谢谢您的帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM