2016-04-22 2 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

Как это:

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] 
] 

И просто конвертировать в формат JSON с NSJSONSerialization, как это:

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

UPDATE:

Если вам нужно добавить значения в массив в словаре можно сделать следующим образом:

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

Это полезно, но я до сих пор не могу добавить многократные иены с этим. Есть ли способ, которым я могу добавить новые 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

Это плохая практика, чтобы принудительно разворачивать данные, которые могут быть ноль. 'try NSJSONSerialization.dataWithJSONObject (курсор!, options: []) '. Если в этом случае 'cursor' будет' nil', приложение будет сбой с ошибкой. Вы должны использовать 'if let ... = ... as? SomeObject' для проверки «курсора». – pacification

+0

Благодарим за умиротворение; Я просмотрю свой код. – user3069232

Смежные вопросы