2017-07-28 83 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

好兄弟..谢谢你的帮助..我用如?串。现在工作很好。 –