2016-05-25 3 views
3

У меня есть следующий JSON.Анализ JSON-ответа в Swift/iOS

[{"chatId":"1","user1_id":"1212","user2_id":"8543211123","user1_name":"dave","user2_name":"daveee","user1_profile_pic":"http:\/\/graph.facebook.com\/1212\/picture?type=large","user2_profile_pic":"https:\/\/scontent-waw1-1.xx.fbcdn.net\/v\/t1.0-9\/1212.jpg?oh=c288ac7b31a61aee751e8ddafb05e78a&oe=57DC702E","message":{"1":{"message_id":"24242241","sender":"1212","chatId":"1","text":"hello i am","timestamp":"2016-05-24 17:13:08"},"2":{"message_id":"421421","sender":"1212","chatId":"1","text":"great","timestamp":"2016-05-24 17:15:08"}}},{"chatId":"2","user1_id":"23413524635","user2_id":"1212","user1_name":"Leo","user2_name":"dave","user1_profile_pic":"https:\/\/scontent-fra3-1.xx.fbcdn.net\/v\/l\/t1.0-1\/1212.jpg?oh=1212&oe=579AE3AE","user2_profile_pic":"http:\/\/graph.facebook.com\/1212\/picture?type=large","message":{"1":{"message_id":"21321213","sender":"1212","chatId":"2","text":"yes, hi","timestamp":"2016-05-25 15:46:57"}}}] 

Хочет петлю через message и для каждого счетчика, извлечь значение. Это мой код:

for anItem in jsonArray as! [Dictionary<String, AnyObject>] 
var chat_messages : [Message]? = nil 
var count_messages = 0; 
if let dataArray = anItem["message"] as? [Int : Dictionary<String, AnyObject> ] { 
    for onemessage in dataArray as! [Dictionary<String, AnyObject>] { 
     let curr_message = Message() 
     if let messageid = onemessage["message_id"] as? String { 
      curr_message.id = messageid 
     } 
     if let messagedate = onemessage["timestamp"] as? NSDate { 
      curr_message.date = messagedate 
     } 
     if let messagesender = onemessage["sender"] as? String { 
      curr_message.sender = messagesender 
     } 
     if let messagetext = onemessage["text"] as? String { 
      curr_message.text = messagetext 
     } 
     chat_messages![count_messages] = curr_message 
     count_messages = count_messages + 1 
    } 
} 

Проблема заключается в том, что линия if let dataArray = anItem["message"] as? [Int : Dictionary<String, AnyObject> ] { всегда терпит неудачу и условие if никогда не вступал.

+0

только предположение: может быть, номера также хранятся в виде строки? Попробовали ли вы использовать '[String: [String: AnyObject]]'? –

+0

Вы имеете в виду '[String: Dictionary ]' – Alk

+0

Это сокращенная форма объявления типов коллекций. Две формы функционально идентичны, но в Swift предпочтение отдается коротким. –

ответ

2

Если вы используете NSJSONSerialization, то каждый словарь имеет тип: [String : AnyObject]. Так эта линия:

if let dataArray = anItem["message"] as? [Int : Dictionary<String, AnyObject> ] { 

должен быть:

if let dataArray = anItem["message"] as? [String : AnyObject] { 

И проходными словарей сообщений внутри dataArray можно заменить:

for onemessage in dataArray as! [Dictionary<String, AnyObject>] { 

с:

for (_, messageDictionary) in dataArray { 
    if let onemessage = messageDictionary as? [String : AnyObject] { 

и Остальная часть кода, чтобы получить различные значения выхода из onemessage словаря должен работать, как вы его написали сейчас, за исключением того, что эта линия будет врезаться:

chat_messages![count_messages] = curr_message 

Потому что вы вынуждены разворачивать chat_messages, который вы инициализирован в ноль:

var chat_messages : [Message]? = nil 

, а не как пустой массив:

var chat_messages = [Message]() 
+0

Как бы я прошел через него tho? Мне нужно как-то пройти мимо «1», «2» и т. Д. – Alk

+0

@mankee Обновленный ответ, чтобы охватить дальнейший цикл –

+0

Большое спасибо, очень полезный ответ :) – Alk