Swift JSON-объект для ключевых вложенных массивов и / или словарей
Я студент и надеюсь, что использую правильную терминологию.
Мне нужно добраться до ключа "описания", чтобы заполнить Label.text. Я могу получить "результаты", но ничего больше я не смог этого достичь, но получал ошибку в индексе, когда я начал использовать AVFoundation
do {
let json = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves)
let a1 = json["results"] as? [[String: AnyObject]]
let a2 = a1![0]
let a3 = a2["lexicalEntries"]
let d1 = a3![0] as? [String: AnyObject]
let d2 = d1!["entries"] as? [[String: AnyObject]]
let a4 = d2![0]
let d3 = a4["senses"] as? [[String: AnyObject]]
let a5 = d3![0]
let d4 = a5["definitions"] as? [String]
let a6 = d4![0]
dispatch_async(dispatch_get_main_queue(), {
//self.wordLabel.text = a6 as String
self.hintLabel.text = a6 as String
})
print(a6)
} catch {
print("error serializing JSON: \(error)")
if wordLabel.text != "" && wordLabel.text != nil {
self.wordLabel.text = "No hints for you!"
}
}
[оригинал - это работает и тянет ключ "определения"][1]
Итак, я попытался использовать код безопасности, используя методологию "сделай / попробуй", но я извлекаю только "результаты". У меня проблема с детализацией. В этом снимке отсутствует синхронизация, но я ее пропустил.
func parseTest(data: NSData) {
do {
//let json = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers)
//Not working
let json: NSDictionary = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
if let results = json["results"] as? [[String: AnyObject]] {
print(" ResultsBegin \(results) ResultsEnd ")
/*for result in results*/
//if let mainDict = (json.objectForKey("results") as? NSArray?)! {
// print("mainDict \(mainDict) mainDict")
if let lexEntry = (json.objectForKey("lexicalEntries") as? NSArray?)! {
print("lexEntry \(lexEntry) lexEntry")
if let entry = (json.objectForKey("entries") as? NSArray?)!{
print("entriesArray \(entry) entriesArray")
if let sense = (json.objectForKey("senses") as? NSArray?)! {
print("senseArray \(sense) senseArray")
if let definition = (json.objectForKey("definitions") as? NSArray?)! {
print("defArray \(definition) defArray")
}
}
}
}
dispatch_async(dispatch_get_main_queue(), {
//self.wordLabel.text = a6 as String
self.hintLabel.text = "Made it to Parse Test Function above catch"
print("Made it to Parse Test Function above catch")
})
}
} catch {
print("error serializing JSON: \(error)")
}
//print(" Parse Test \(def)")
}
func parse(data: NSData) {
print("Made it to Regular Parse Function")
[Не тянет кнопку "Определения"][2]
Словарь выглядит следующим образом
results = (
{
id = angular;
language = en;
lexicalEntries = (
{
entries = (
{
etymologies = (
"late Middle English (as an astrological term): from Latin angularis, from angulus angle"
);
senses = (
{
definitions = (
"having angles or sharp corners"
);
2 ответа
func parse(data: NSData) { print("Сделано в обычной функции анализа")
do {
let json = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves)
if let dict = json["results"] as? [Dictionary<String,AnyObject>]{
print("inside dict")
if let lex = dict[0]["lexicalEntries"] as?[Dictionary<String,AnyObject>]{
print("inside lex")
if let entry = lex[0]["entries"] as? [Dictionary<String,AnyObject>]{
print("inside entry")
if let sense = entry[0]["senses"] {
print("inside sense")
if let define = sense[0]["definitions"] as? [String] {
print("inside define")
let def = define[0]
print("this is def")
print(def)
//self.hintLabel.text = "\(def)"
dispatch_async(dispatch_get_main_queue(), {
self.hintLabel.text = "\(def)"
})
}
}
}
}
}
} catch {
print("error serializing JSON: \(error)")
if hintLabel.text != "" && hintLabel.text != nil {
self.hintLabel.text = "Sorry, a hint is not available for this word!"
}
} }
Слишком глубокое вложение является одной из известных плохих практик, и использование NSArray
против безопасности типов, и вы все еще используете много !
s в вашем "Коде безопасности", который действительно небезопасен.
Ваш if-let можно записать примерно так:
if
let a1 = json["results"] as? [[String: AnyObject]] where !a1.isEmpty,
case let a2 = a1[0],
let a3 = a2["lexicalEntries"] as? [[String: AnyObject]] where !a3.isEmpty,
case let d1 = a3[0],
let d2 = d1["entries"] as? [[String: AnyObject]] where !d2.isEmpty,
case let a4 = d2[0],
let d3 = a4["senses"] as? [[String: AnyObject]] where !d3.isEmpty,
case let a5 = d3[0],
let d4 = a5["definitions"] as? [String] where !d4.isEmpty,
case let a6 = d4[0]
{
//...
print(a6)
}
Вы должны проверить, имеет ли массив достаточное количество элементов, прежде чем получать элемент с подписками, а также проверить не нулевой результат подписки на словарь.