2015-06-15 8 views
0

Я хотел бы попросить небольшую помощь.Быстрая итерация по массиву

У меня есть метод, который вызывает веб-сервис и получает от него объект json.

это выглядеть следующим образом:

func wsServiceFeedTst() { 
     println("WS called...") 
     println("tstFrames count: " + tstFrames.count.description) 

     let json = JSON(url:"http://79.172.249.175:7001/RestWebServiceApp/webresources/entity.bkkkallerfeedtst") 

     println(json) 

     for (k, v) in json["bkkKallerFeedTst"] { 

      let dateShow : NSDate? = v["feedDate"].asDate 
      var finalFormatter = NSDateFormatter() 
      finalFormatter.dateFormat = "yyyy.MM.dd - HH:mm" 
      let finalDate = finalFormatter.stringFromDate(dateShow!) 

      tstFrames.append(TimeFrame(text: v["feedText"].description, date: finalDate, image: nil, routeName: v["feedRouteShName"].description, postId: v["id"].description,routType: v["feedImgType"].description)) 

     } 

    } 

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

let finalDate = finalFormatter.stringFromDate(dateShow!) 

его ждет не обязательно, но получить ноль вызванные этой линии:

let dateShow : NSDate? = v["feedDate"].asDate 

это как мой JSON выглядит, когда у него есть только один элемент:

{"bkkKallerFeedTst":{"feedRouteShName":"143","id":"348","feedLat":"47.5998971180592","feedImgType":"3","feedDate":"2015-06-15T14:07:30+02:00","feedLon":"19.0457082953807","feedText":"Itthon :)”}} 

И вот как это выглядит, когда он имеет более одного элемента (теперь он имеет два элемента)

{"bkkKallerFeedTst":[{"feedRouteShName":"H5","id":"349","feedLat":"47.5535475845461","feedImgType":"2","feedDate":"2015-06-15T15:27:02+02:00","feedLon":"19.0458004338391","feedText":"Hév ;)"},{"feedRouteShName":"143","id":"348","feedLat":"47.5998971180592","feedImgType":"3","feedDate":"2015-06-15T14:07:30+02:00","feedLon":"19.0457082953807","feedText":"Itthon :)"}]} 

Есть ли у кого-нибудь идеи о том, как это решить?

спасибо!

К ответу я создать это:

var bkkKallerFeedTst = json["bkkKallerFeedTst"] 
var bkkKallerFeedTstArray : [[NSObject : AnyObject]] 
bkkKallerFeedTstArray = [] 
if bkkKallerFeedTst.isDictionary { 

    bkkKallerFeedTstArray.append(bkkKallerFeedTst.asDictionary!) 
} else { 

} 

for feed in bkkKallerFeedTstArray { 
    println(feed["feedRouteShName"]) //now its printing: Optional(143) 

} 

теперь он это печать:

[feedImgType: 3, feedRouteShName: 143, feedLat: 47.5998971180592, feedText: Itthon :), feedLon: 19.0457082953807, id: 348, feedDate: 2015-06-15T14:07:30+02:00] 

UPDATE: это решение ..

var bkkKallerFeedTst = json["bkkKallerFeedTst"] 
     var bkkKallerFeedTstArray : [JSON] 

     if bkkKallerFeedTst.isDictionary { 
      bkkKallerFeedTstArray = [bkkKallerFeedTst] //initialize 
     } else { 
      bkkKallerFeedTstArray = bkkKallerFeedTst.asArray! 
     } 

     for bkk in bkkKallerFeedTstArray { 

      let dateShow : NSDate = bkk["feedDate"].asDate! 
      var finalFormatter = NSDateFormatter() 
      finalFormatter.dateFormat = "yyyy.MM.dd - HH:mm" 
      let finalDate = finalFormatter.stringFromDate(dateShow) 

      tstFrames.append(TimeFrame(text: bkk["feedText"].description, date: finalDate, image: nil, routeName: bkk["feedRouteShName"].description, postId: bkk["id"].description,routType: bkk["feedImgType"].description)) 

     } 
+0

Вы можете заявить свой вопрос в одной строке? – Aggressor

+0

мой вопрос в том, как перебирать мой объект json, если он имеет только один узел. – solarenqu

+0

Число пар ключей: значение не имеет значения с итерацией. Итак, есть ли у него 1 или 10, это не имеет значения, его та же логика – Aggressor

ответ

1

Это, вероятно, будет лучше сначала определить объект JSON, чтобы он генерировал массив с одним значением, а не таким образом, но в противном случае вы ld проверьте, действительно ли вы получили действительную дату, и если вы не попробуете ее по-другому.

Но, смотря на API, который вы использовали, здесь https://github.com/dankogai/swift-json, кажется, вы можете проверить, получаете ли вы словарь или массив. Поэтому я хотел бы указать значение dictioanry на явно типизированную переменную для ясности с использованием метода .isDictionary.

например. что-то похожее на

var bkkKallerFeedTst = json["bkkKallerFeedTst"] 
var bkkKallerFeedTstArray : [JSON] 

if bkkKallerFeedTst.isDictionary { 
    bkkKallerFeedTstArray = [bkkKallerFeedTst] //initialize 
} else { 
    bkkKallerFeedTstArray = bkkKallerFeedTst.asArray 
} 

Может быть, не такой точный код - у меня нет api.

Затем вы можете перебирать сначала через массив (для? В bkkKallerFeedTstArray), затем внутрь через словарь содержащегося (как вы делали раньше)

В основном убедитесь, что у вас есть массив словарей первого, прежде, чем делать то операции.

Пример с кодом:

func wsServiceFeedTst() { 
    println("WS called...") 
    println("tstFrames count: " + tstFrames.count.description) 

    let json = JSON(url:"http://79.172.249.175:7001/RestWebServiceApp/webresources/entity.bkkkallerfeedtst") 

    println(json) 

    var bkkKallerFeedTst = json["bkkKallerFeedTst"] 
    var bkkKallerFeedTstArray : [JSON] 

    if bkkKallerFeedTst.isDictionary { 
     bkkKallerFeedTstArray = [bkkKallerFeedTst] //initialize 
    } else { 
     bkkKallerFeedTstArray = bkkKallerFeedTst.asArray 
    } 

    for bkk in bkkKallerFeedTstArray { 

     let dateShow : NSDate = bkk["feedDate"].asDate! 
     var finalFormatter = NSDateFormatter() 
     finalFormatter.dateFormat = "yyyy.MM.dd - HH:mm" 
     let finalDate = finalFormatter.stringFromDate(dateShow) 

     tstFrames.append(TimeFrame(text: v["feedText"].description, date: finalDate, image: nil, routeName: v["feedRouteShName"].description, postId: v["id"].description,routType: v["feedImgType"].description)) 

    } 

} 
+0

Спасибо, но это не значит, что я пытаюсь получить дату или что-то еще .. let dateShow: NSDate? = v ["feedDate"]. asDate это может быть что-то еще String и т. д., потому что массив с именем v не существует .. проверьте два json в моем вопросе .. когда у меня есть один line в базе данных, мой java-сервер создаст json вот так: {"bkkKallerFeedTst": {.... но если В базе данных более одной строки мой json будет массивом: {"bkkKallerFeedTst": [{... и мой код работает отлично, когда у моего json больше строк ... потому что v-массив будет существовать. извините, но я не могу описать лучшую проблему. – solarenqu

+0

Я полностью понимаю - проблема у вас есть, когда вы обращаетесь к json ["bkkKallerFeedTst"] - он не знает, является ли это массивом или словарем. Вы должны убедиться, что это всегда массив - так что вы можете обрабатывать все равномерно. Я попытаюсь включить ваш код в ответ - попробуйте, могут быть ошибки, поэтому, пожалуйста, не стесняйтесь их редактировать. –

+0

спасибо, пожалуйста, уточните мой обновленный вопрос .. Я попытался создать то, что вы написали в своем ответе. – solarenqu