2016-04-22 58 views
1

我有一个对象“itensList”,它具有字段“name”,“createdAt”和一个“itens”数组。如何使用数组从字典中创建JSON

我希望能够建立JSON看起来像这样:

{ 
    "name": "List name" 
    "CreatedAt": "12:12 12/12/2016" 
    "itens": [ 
    { 
     "title": "Item title" 
     "CreatedAt": "12:13 12/12/2016" 
     "isDone": false 
    }, 
    { 
     "title": "Another item title" 
     "CreatedAt": "12:14 12/12/2016" 
     "isDone": true 
    } 
    ] 
} 

我曾尝试没有成功的几个不同的方法。

项目对象

class Item: Object { 

    dynamic var name = "" 
    dynamic var createdAt = NSDate() 
    dynamic var isDone = false 

} 

项目列表对象

class ItemList: Object { 

    dynamic var name = "" 
    dynamic var createdAt = NSDate() 
    let itens = List<Item>() 
} 
+0

我甚至无法编译它,我不认为它是相关的。我无法在字典中嵌套数组... –

+0

我认为这是可以理解的方式,我问道,对不起。我要编辑它。 –

回答

1

对于这个例子,让我们做类似于你必须有什么样的对象:

class Iten { 
    let title:String 
    let createdAt:String 
    let isDone:Bool 

    init(title: String, createdAt: String, isDone: Bool) { 
     self.title = title 
     self.createdAt = createdAt 
     self.isDone = isDone 
    } 

} 

我认为关键是要增加一个计算值,将返回一个字典:

class Iten { 
    let title:String 
    let createdAt:String 
    let isDone:Bool 

    init(title: String, createdAt: String, isDone: Bool) { 
     self.title = title 
     self.createdAt = createdAt 
     self.isDone = isDone 
    } 

    var toDictionary: [String:AnyObject] { 
     return ["title": title, "createdAt": createdAt, "isDone": isDone] 
    } 
} 

让我们使用它:

let iten1Dict = Iten(title: "title1", createdAt: "date1", isDone: false).toDictionary 
let iten2Dict = Iten(title: "title2", createdAt: "date2", isDone: true).toDictionary 

我们现在做封装词典:

let dict: [String:AnyObject] = ["name": "List name", "createdAt": "dateX", "itens": [iten1Dict, iten2Dict]] 

要完成,我们这个字典编码为JSON 数据然后我们把它解码为一个字符串:

do { 
    let jsonData = try NSJSONSerialization.dataWithJSONObject(dict, options: .PrettyPrinted) 
    if let jsonString = String(data: jsonData, encoding: NSUTF8StringEncoding) { 
     print(jsonString) 
    } 
} catch let error as NSError { 
    print(error) 
} 

,瞧:

{ 
    "createdAt" : "dateX", 
    "itens" : [ 
    { 
     "title" : "title1", 
     "createdAt" : "date1", 
     "isDone" : false 
    }, 
    { 
     "title" : "title2", 
     "createdAt" : "date2", 
     "isDone" : true 
    } 
    ], 
    "name" : "List name" 
} 
+0

这解决了我的问题!我只是在项目中添加了一个循环,并将它们作为字典添加到NSMutableArray中,并在代码中设置为“项目”。非常感谢! –

+0

不错!别客气。 :) – Moritz

0

像这样:

do { 
    let json = try NSJSONSerialization.dataWithJSONObject(mainDictionary, options: []) 
} catch { 
    print(error) 
} 
01:

var item = [ 
    "title": "Item title", 
    "CreatedAt": "12:13 12/12/2016", 
    "isDone": false 
] 

var mainDictionary = [ 
    "name": "List name", 
    "CreatedAt": "12:12 12/12/2016", 
    "items": [item] 
] 

而只是转换与NSJSONSerialization像这样JSON

UPDATE:

如果需要值字典添加到阵列可以是这样做的:

if var items = mainDictionary["items"] as? NSMutableArray { 
    items.addObject(newItem) 
    mainDictionary["items"] = items 
} 
+0

这是有用的,但我仍然不能添加倍数itens与此。有什么方法可以附加新的itens?像 mainDictionary [“items”]。append(newItemDictionary) –

+0

@RaphaelSouza,我更新你的问题的答案。 – pacification

0

拉斐尔,

这段代码构建一个JSON查询。它应该让你开始,只要继续黑客攻击,你就会找到一种方法!这是编程的乐趣!

func JSONquery() 
let request = NSMutableURLRequest(URL: NSURL(string:  "https://api.dropboxapi.com/2/files/get_metadata")!) 
    let session = NSURLSession.sharedSession() 
    request.HTTPMethod = "POST" 

    request.addValue("application/json",forHTTPHeaderField: "Content-Type") 
    request.addValue("path", forHTTPHeaderField: lePath) 
    let cursor:NSDictionary? = ["path":lePath] 
    do { 
     let jsonData = try NSJSONSerialization.dataWithJSONObject(cursor!, options: []) 
     request.HTTPBody = jsonData 
     print("json ",jsonData) 
    } catch { 
     print("snafoo alert") 
    } 

     let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 
     if let error = error { 
      completion(string: nil, error: error) 
      return 
     } 
     let strData = NSString(data: data!, encoding: NSUTF8StringEncoding) 
     //print("Body: \(strData)\n\n") 
     do { 
      let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers); 
      self.jsonPParser(jsonResult,field2file: "ignore") 
      /*for (key, value) in self.parsedJson { 
       print("key2 \(key) value2 \(value)") 
      }*/ 

      completion(string: "", error: nil) 
     } catch { 
      completion(string: nil, error: error) 
     } 
    }) 
    task.resume() 

} 
+2

强行打开可能为零的数据是不好的做法。 '试试NSJSONSerialization.dataWithJSONObject(cursor!,选项:[])'。如果在这种情况下'cursor'将会是'nil',你的应用程序将会崩溃并出错。你应该使用'if let ... = ... as? SomeObject'来检查'cursor'。 – pacification

+0

感谢安抚;我会检查我的代码。 – user3069232