2014-12-06 2 views
1

Для бэкэнд-коммуникаций моему приложению требуется метод создания четко структурированного JSON, и это то, где я боюсь. Созданного JSON должно выглядеть следующим образом:Создание определенной структуры данных JSON в Swift

{  
"data": {  
"color":"yellow",  
"size":"big"  
}  
}  

Сериализация словарь с требуемыми данными не действительно, кажется, есть возможность форматирования содержимого должным образом, мои лучшие результаты выглядят следующим образом:

Optional({  
Kategorie = Strassenschaeden;  
PLZ = 46282;  
Strasse = Erftweg;  
Unterkategorie = Schlagloch;  
})  

Я не нашел полезных ссылок для моей проблемы, а так как им новый для Swift и его документации Im kinda застрял в данный момент. Итак, мои вопросы: Какова предпочтительная структура данных для данных JSON (Dictionary/Array) и как я могу создать JSON, который хорошо сформирован? Заранее спасибо :)

Edit: Это интересная часть того, что я использовал, чтобы достичь своей "лучший результат":

var data: [String: String] = ["Kategorie": "\(Kategorie)", "Unterkategorie": "\(Unterkategorie)", "Strasse": "\(Strasse)","PLZ": "\(PLZ)"] 

self.post(data, url: "http://*************") { (succeeded: Bool, msg: String) ->() in 
     var alert = UIAlertView(title: "Success!", message: msg, delegate: nil, cancelButtonTitle: "Okay.") 

func post(params : Dictionary<String, String>, url : String, postCompleted : (succeeded: Bool, msg: String) ->()) { 
    var request = NSMutableURLRequest(URL: NSURL(string: url)!) 

let JSONData:NSData = NSJSONSerialization.dataWithJSONObject(params, options: NSJSONWritingOptions.PrettyPrinted, error: &err)! 
var json = NSJSONSerialization.JSONObjectWithData(JSONData, options: nil, error: &err) as? NSDictionary 
println(json) 
+0

Вы посмотрите на NSJSONSerialization? В Swift уже много вопросов и ответов об использовании этого класса. –

+0

Да, я сделал, каждый вариант NSJSONWritingOptions не подходит для моей проблемы, например PrettyPrinted. – Raijen

+0

Что вы пробовали? – GoZoner

ответ

2

Здесь

let JSONData:NSData = NSJSONSerialization.dataWithJSONObject(params, options: NSJSONWritingOptions.PrettyPrinted, error: &err)! 
var json = NSJSONSerialization.JSONObjectWithData(JSONData, options: nil, error: &err) as? NSDictionary 

вы конвертируете params словарь для данных JSON - и затем вы конвертируете данные из JSON обратно в словарь! То, что вы, вероятно, хотите, чтобы создать строку из данных JSON:

let jsonData = NSJSONSerialization.dataWithJSONObject(params, options: .PrettyPrinted, error: &err)! 
let json = NSString(data: jsonData, encoding: NSUTF8StringEncoding)! 
println(json) 

Примечания:

  • Свойства и переменные должны иметь имена, начинающиеся с букв нижнего регистра, например, jsonData.
  • Явный тип аннотации :NSData здесь не нужен, компилятор Swift может вывести тип автоматически.
  • Опция может быть задана как .PrettyPrinted вместо NSJSONWritingOptions.PrettyPrinted, компилятор автоматически передает тип перечисления .
  • Вместо принудительной разворачивания с помощью ! вы должны использовать дополнительную привязку для проверки для успеха.
+0

Спасибо, это очень полезно :) Итак, мои данные уже в хорошем формате, что меня беспокоило, это просто печать словаря, верно? И любая идея, как я могу обменять необязательный() на «данные» {? – Raijen

+0

@Raijen: Если вы посмотрите на определение 'JSONObjectWithData()', вы увидите, что он возвращает 'AnyObject? '. Знаки вопроса указывают на * необязательный *, который может быть «nil» (для «no value»), если функция «failed». Unwrapping - это один из способов «удалить необязательный», необязательное связывание - другое. - Нет никакого способа обойти это: если вы хотите серьезно программировать в Swift, вы должны * полностью понять, что такое факультатив и как работает. Он освещен в официальной документации Swift, а также во многих вопросах и ответах здесь, на SO. –

+0

Я собираюсь прочитать это, спасибо :) Любые советы о том, как добавить данные слова перед моим JSON? Поскольку для его использования требуется массив или словарь, у меня действительно нет идеи. Думал, что имя используемого словаря будет частью объекта в моем JSON, я конвертирую словарь в. – Raijen

0

Просто зуд, что никто здесь не рекомендует swiftyJSON для работы с JSON в Swift.

Попробуйте, вы потеряете боль от работы с JSON. https://github.com/SwiftyJSON/SwiftyJSON

читать JSON

let jsonData = jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) 
let jsonObject = JSON(data: jsonData!) 

написать JSON

let jsonString = jsonObject.rawString() 
+0

Это хорошая библиотека, но она не имеет отношения к этому вопросу, что касается _creating_ JSON, не читая его. – jrturton

+0

Я обновил объяснение, как читать и писать JSON. Достаточно хорошо прочитать JSON, да? – ramacode

+0

Хороший совет, действительно хорошая библиотека :) Даже если получение через JSON Serialization улучшило мои навыки кодирования в отношении Swift, поэтому я бы порекомендовал другим начинающим проработать свой путь через этот зуд, потому что это очень полезный урок. – Raijen

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