如何在swift中解析字符串数组?

时间:2018-01-20 18:08:23

标签: arrays json swift api parsing

我正在编写一个简单的完整堆栈应用程序,我从后端返回,在某些情况下,就像下面的字符串数组一样:

["one","two","three"]

我现在遇到的问题是这个返回不能像普通的JSON数据那样在swift中解析。我搜索但没有发现任何东西我想做的是:

let json = try JSONSerialization.jsonObject(with: data!, options: [.mutableContainers, .allowFragments]) as? [String]

不幸的是,这根本不起作用 我怎样才能像普通数组那样解析它?

提前致谢。

更新: 我在下面添加一些更相关的代码:

let task = URLSession.shared.dataTask(with: request as URLRequest){
        data, response, error in {
            do {
                let json =  try JSONSerialization.jsonObject(with: data!, options: [.mutableContainers, .allowFragments]) as? [String]
                print(json)
            }catch{
                print(error)
            }
 }
datatask.resume()

我在控制台中收到的错误是“Error Domain = NSCocoaErrorDomain Code = 3840”字符0周围的值无效。“UserInfo = {NSDebugDescription =字符0周围的值无效。}”

谢谢你们所有人。

2 个答案:

答案 0 :(得分:2)

如果您收到 3840错误,则JSON无效JSON,句点。

数组的JSON字符串应该是

let jsonString = "[\"one\",\"two\",\"three\"]"

Swift 4文字多行语法显示没有转义反斜杠的实际格式

let jsonString = """
["one","two","three"]
"""

您可以在没有任何选项的情况下解析它(没有.allowFragments 没有.mutableContainers

let data = Data(jsonString.utf8)
do {
    let array = try JSONSerialization.jsonObject(with: data) as! [String]
    print(array) // ["one", "two", "three"]
} catch {
    print(error)
}

几乎每个人都误用JSONSerialization阅读选项

    仅当根对象数组且字典时,才需要
  • .allowFragments
  • .mutableContainers 在Swift
  • 中毫无意义

在99%的情况下,您可以省略options参数

答案 1 :(得分:0)

您必须提供适当的JSON响应作为数据。之后,JSON序列化将正常工作。您的JSON响应应该是这样的:

{
  "array": [
    "one",
    "two",
    "three"
  ]
}

let json =  try JSONSerialization.jsonObject(with: data!, options: [.mutableContainers, .allowFragments]) as? [String]
                print(json)

在上面一行之后,您的数组响应会像这样 - http://jsoneditoronline.org/?id=eafd7ff34b45b2a380ebbe5959607906

更新####

您的响应从数组开始,它包含字典,请参阅下面的示例代码

    let jsonString = """
[{"Name":"one"},{"Name":"two"},{"Name":"three"}]
"""

if let jsonData = jsonString.data(using: .utf8)
{
    let json =  try JSONSerialization.jsonObject(with: jsonData, options: [.mutableContainers, .allowFragments]) as? [[String:String]]
    print(json)
}