2014-09-09 3 views
2

Вот мои данные Json.Как разобрать Json и получить требуемые значения в Swift/iOS?

{ 
    "products":[ 

    { 
     "capacity":4, 
     "image":"http:\/\/d1a3f4spazzrp4.cloudfront.net\/car-types\/mono\/mono-uberx.png", 
     "display_name":"uberX", 
     "product_id":"a1111c8c-c720-46c3-8534-2fcdd730040d", 
     "description":"The low-cost Uber" 
     }, 
     { 
     "capacity":6, 
     "image":"http:\/\/d1a3f4spazzrp4.cloudfront.net\/car-types\/mono\/mono-uberxl2.png", 
     "display_name":"uberXL", 
     "product_id":"821415d8-3bd5-4e27-9604-194e4359a449", 
     "description":"low-cost rides for large groups" 
     }, 
     { 
     "capacity":4, 
     "image":"http:\/\/d1a3f4spazzrp4.cloudfront.net\/car-types\/mono\/mono-black.png", 
     "display_name":"UberBLACK", 
     "product_id":"d4abaae7-f4d6-4152-91cc-77523e8165a4", 
     "description":"The original Uber" 
     }, 
     { 
     "capacity":6, 
     "image":"http:\/\/d1a3f4spazzrp4.cloudfront.net\/car-types\/mono\/mono-suv.png", 
     "display_name":"UberSUV", 
     "product_id":"8920cb5e-51a4-4fa4-acdf-dd86c5e18ae0", 
     "description":"Room for everyone" 
     }, 
     { 
     "capacity":4, 
     "image":"http:\/\/d1a3f4spazzrp4.cloudfront.net\/car-types\/mono\/mono-taxi.png", 
     "display_name":"uberTAXI", 
     "product_id":"3ab64887-4842-4c8e-9780-ccecd3a0391d", 
     "description":"Taxi without the hassle" 
     } 
    ] 
} 

Я хочу, чтобы все значения, представленные с помощью клавиш i.e capacity, image, display_name,product_id, description и сохранить в списках, приведенных ниже

var array_capacity = Array<Int>(); 
    var array_image = Array<String>(); 
    var array_display_name = Array<String>(); 
    var array_product_id = Array<String>(); 
    var array_description = Array<String>(); 

, но он разбился. Я думаю, это из-за кастинга.

Вот мой синтаксический код.

var responseDict: NSDictionary = NSJSONSerialization.JSONObjectWithData(responseData,options: NSJSONReadingOptions.MutableContainers, error:nil) as NSDictionary 

     if(!(responseDict==nil)){ 

      var products: NSArray = responseDict["products"] as NSArray 

       for item in products { // loop through data items 
        let obj = item as NSDictionary 
        for (key, value) in obj { 


         // print(key as String); 

         array_product_id.append(value as String); 
         array_display_name.append(value as String); 
         array_image.append(value as String); 
         array_description.append(value as String); 
         array_capacity.append(value as Int); 

       } 

      } 


     } 

Вход

libswiftCore.dylib`swift_dynamicCastObjCClassUnconditional: 
0x109c55f30: pushq %rbp 
0x109c55f31: movq %rsp, %rbp 
0x109c55f34: pushq %rbx 
0x109c55f35: pushq %rax 
0x109c55f36: movq %rsi, %rcx 
0x109c55f39: movq %rdi, %rbx 
0x109c55f3c: xorl %eax, %eax 
0x109c55f3e: testq %rbx, %rbx 
0x109c55f41: je  0x109c55f5d    ; swift_dynamicCastObjCClassUnconditional + 45 
0x109c55f43: movq 0x7858e(%rip), %rsi  ; "isKindOfClass:" 
0x109c55f4a: movq %rbx, %rdi 
0x109c55f4d: movq %rcx, %rdx 
0x109c55f50: callq *0x63112(%rip)   ; (void *)0x000000010be04000: objc_msgSend 
0x109c55f56: testb %al, %al 
0x109c55f58: movq %rbx, %rax 
0x109c55f5b: je  0x109c55f64    ; swift_dynamicCastObjCClassUnconditional + 52 
0x109c55f5d: addq $0x8, %rsp 
0x109c55f61: popq %rbx 
0x109c55f62: popq %rbp 
0x109c55f63: retq 
0x109c55f64: leaq 0xecc7(%rip), %rax  ; "Swift dynamic cast failed" 
0x109c55f6b: movq %rax, 0x7fbe6(%rip)  ; gCRAnnotations + 8 
0x109c55f72: int3 
0x109c55f73: nopw %cs:(%rax,%rax) 
+0

Можете ли вы поделиться журналом сбоев? –

+0

@RaymondBrion см. Мое редактирование –

ответ

1

Проблема здесь состоит в том, что вы итерация NSDictionary в быстром пути. NSDictionary, похоже, не соответствует быстрой последовательности, поэтому ваша итерация по NSDictionary с использованием ключевого значения падает. Используйте методы AllKeys для NSDictionary и тянуть значения регулярно, как вы могли бы сделать для Objective C, как это так,

if let jsonData = jsonString?.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false){ 

    if let jsonObject = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.AllowFragments, error: nil) as? [String: AnyObject]{ 

    if let products: AnyObject = jsonObject["products"]{ 

     for aProduct in products as NSArray{ 

     for aKey in (aProduct as NSDictionary).allKeys{ 

      println(aKey) 

     } 

     } 

    } 
    } 

} 

Одна вещь, которую вы делаете неправильно это добавление значения из словаря, и вы используете динамическое приведение к переведите его в строку или Int. Это не способ сделать, и это снова приводит к сбою вашего кода, но вам необязательно проверять, может ли он быть применен к типу, используя let, а затем добавьте значение в ваш массив.

+0

спасибо за ваше время. как я могу проверить, что его можно отличить? способ применения если let. Я новый, быстрый.пожалуйста, помогите –

1

Возможно, произошла ошибка в этой части:

array_product_id.append(value as String); 
array_display_name.append(value as String); 
array_image.append(value as String); 
array_description.append(value as String); 

Вы можете проверить, если значение может быть литыми ред к конкретному объекту, как это:

if let specificObject = dictionary["key"] as? String 
{ 
    // specificObject has a value of string 
} 
else 
{ 
    // dictionary["key"] can't be cast-ed to string 
} 

В приведенном выше примере проверить, если значение dictionary["key"] может быть изменено до String.

ОБНОВЛЕНИЕ: Изменить эти линии. Вы выполняете итерацию через словарь, содержимое value может быть строкой и литой в Int или наоборот, вызывая ошибку.

for (key, value) in obj { 

    array_product_id.append(value as String); 
    array_display_name.append(value as String); 
    array_image.append(value as String); 
    array_description.append(value as String); 
    array_capacity.append(value as Int); 

} 

Вместо:

// Remove the for-loop 

array_product_id.append(obj["your_key_here"] as String); 
array_display_name.append(obj["your_key_here"] as String); 
array_image.append(obj["your_key_here"] as String); 
. 
. 
. 
+0

по-прежнему получать ту же ошибку –

+0

См. мой обновленный ответ. Благодарю. – Hokage

+0

Спасибо, теперь это сработало. но я должен использовать цикл. например, если продукция: AnyObject = responseDict ["products"] { для продукта в продуктах NSArray { array_capacity.append (aProduct ["capacity"] as Int); array_image.append (aProduct ["image"] as String); array_display_name.append (aProduct ["display_name"] as String); array_product_id.append (aProduct ["product_id"] как строка); } –

0

Для меня ошибка отливка была потому, что значения были целыми:

"capacity":4, 

делает все значения в виде строки:

"capacity":"4", 

устраняет ошибку кастинга:

 for item in products { // loop through data items 
       let obj = item as NSDictionary 
       for (key, value) in obj { 
       println("\"\(key as String)\" : \"\(value as String)\"") 
     } 

     } 

Если вам не нужно значение, которое должно быть в Int. Это то, что сработало для меня.

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