2017-07-28 100 views
0

我想將JSON字符串轉換爲數組。 JSON字符串是:JSON到數組轉換

[ 
    { 
    "field_value" : "28 Aug 2017", 
    "field_data_type_combo_value" : "", 
    "field_data_type_category_id" : "1", 
    "form_id" : "19", 
    "field_id" : "133", 
    "message_unique_id" : "7941501245582800298", 
    "field_data_type_combo_id" : "0", 
    "field_data_type_id" : "1" 
    }, 
    { 
    "field_value" : "", 
    "field_data_type_combo_value" : "", 
    "field_data_type_category_id" : "9", 
    "form_id" : "19", 
    "field_id" : "134", 
    "message_unique_id" : "7941501245582714588", 
    "field_data_type_combo_id" : "0", 
    "field_data_type_id" : "26" 
    }, 
    { 
    "field_value" : "hk", 
    "field_data_type_combo_value" : "", 
    "field_data_type_category_id" : "6", 
    "form_id" : "19", 
    "field_id" : "135", 
    "message_unique_id" : "7941501245582699681", 
    "field_data_type_combo_id" : "0", 
    "field_data_type_id" : "17" 
    } 
] 

和我的轉換代碼是

if let data = text.data(using: .utf8) { 
    do { 
     return try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String : AnyObject] 
    } catch { 
     print(error.localizedDescription) 
    } 
} 

轉換結果永遠是零。我還檢查了聯機JSON查看器中的JSON字符串以及該字符串是否正確。請幫助我們。

+0

爲什麼你傳遞'.mutableContainers'但是把結果賦給一個不可變的常量? – vadian

回答

1

你明確地在你的電話寫:使用相應的投修正你的代碼

as? [String: AnyObject] 

換句話說,你問斯威夫特採取一切JSON返回,檢查它是否是一個字典使用string鍵,並返回該字典或零。由於你的數據是一個數組而不是字典,它返回nil。確切地說,你要求什麼,但不是你想要的。

你期待的是一個字典數組,而不是一本字典。你也應該使用Any而不是AnyObject。因此,使用

as? [[String: Any]] 

轉換它的外[]意味着它是一個數組,內[字符串:任何]意味着陣列中的項目必須具有字符串鍵和的任何值的字典。

爲什麼你使用.mutableContainers?如果你有一個很好的理由,你可以解釋然後使用它。如果你沒有,只是從某處複製代碼,然後將其刪除。

1

這json不是頂級字典,而是一個數組。你可以從[ ... ]看到,如果它是{ ... },它將會是一個字典。

return try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [AnyObject] 
+0

感謝兄弟。現在工作正常..爲什麼即時通過價值作爲可選(價值) –

+0

@TestTest因爲'as?',試圖把它包裝在'如果讓...' – luk2302

+0

好兄弟..謝謝你的幫助..我用如?串。現在工作很好。 –