【问题标题】:How to parse array of strings in swift?如何快速解析字符串数组?
【发布时间】:2018-01-20 18:08:23
【问题描述】:

我正在编写一个简单的全栈应用程序,并且在某些情况下,我从后端返回的结果就像一个字符串数组,如下所示:

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

我现在遇到的问题是无法像通常的 JSON 数据那样快速解析此返回。我搜索但一无所获。我想做的是:

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 周围的值无效。}”

谢谢大家。

【问题讨论】:

  • 显示更多相关代码。 data 来自哪里?您尝试解析的实际值是多少?
  • 我在帖子中添加了更多信息,请再看一遍。
  • @vadian 然后控制台对我大喊大叫,抱怨 json 返回既不是数组也不是字典。

标签: arrays json swift api parsing


【解决方案1】:

如果您收到 3840 错误,则说明 JSON 不是有效的 JSON,句号。

该数组的等效 JSON 字符串应该是

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

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

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

您可以在没有任何选项的情况下解析它(no .allowFragmentsno .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 仅在根对象为 not 数组且 not 字典
  • 时才需要
  • .mutableContainers 在 Swift 中完全没有意义

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

【讨论】:

  • 感谢您的回答。你知道什么相当于在 php 中,因为我尝试使用邮递员测试返回并且看起来不错?
  • php 等价于$array = array('one', 'two','three');
  • 这就是我的工作!我使用array_push($array, $row->Name) 其中$row 是$row = mysqli_fetch_object($result)
  • 请在JSONSerialization 行之前创建一个字符串let string = String(data: data!, encoding: .utf8) 并打印并发布。
【解决方案2】:

您必须提供正确的 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)
}

【讨论】:

  • 我会这样做,但它也不起作用,例如我尝试返回:[{"Name":"one"},{"Name":"two"},{"Name":"three"}] 但仍然无法将其解析为[Dictionary<String,String>]
猜你喜欢
  • 2020-02-28
  • 2023-02-22
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 2011-03-11
相关资源
最近更新 更多