我正在尝试从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 ?? [:]
}
}
有人能指出我正确的方向还是其他可以帮助我解决此问题的答案?谢谢
答案 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]
}
不过感谢您的帮助。