Swift 中的特殊 JSON 解析 [关闭]

Posted

技术标签:

【中文标题】Swift 中的特殊 JSON 解析 [关闭]【英文标题】:Special JSON parsing in Swift [closed] 【发布时间】:2016-05-24 22:43:57 【问题描述】:

我想构建一个 ios 应用程序,我需要为此 JSON 字符串创建一个仅显示内容的数组:

[ "content":"hello", "content":"hi", "content":"how are you?" ]

结果应该是这样的:

["hello", "hi", "how are you?"]

如何在 Swift 中做到这一点?

这是我在 ViewController.swift 文件中的代码:

import UIKit

class ViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()

        let mList = "["content":"hello","content":"hi","content":"how are you?"]"
        let data = mList!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!

    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
    

【问题讨论】:

在 iOS 和 Swift 中如何解析 JSON 的例子不胜枚举。请做一些基础研究并尝试一下。当您遇到特定实现时,请使用相关代码更新您的问题并解释您遇到的问题。 @rmaddy 感谢您的快速回复!我已经花了几个小时来研究如何做到这一点,但仍然没有得到答案。我的问题是我的 JSON 字符串的开头没有“标题”,我能找到的只是带有“标题”的数组的教程。我也很乐意为网站等提供任何建议,并将努力改进我的问题。 你得到一个包含三个字典的数组,每个字典都有一个键/值对。您想要一个包含三个值的数组。做到这一点,你做了不可思议的事情:编写你自己的代码。实际上是一行。 问题已经解决了。不过还是谢谢你。 【参考方案1】:
let mList = "[\"content\":\"hello\",\"content\":\"hi\",\"content\":\"how are you?\"]"
let JSONData = mList.dataUsingEncoding(NSUTF8StringEncoding)!
var json: Array<AnyObject>!
do 
    json = try NSJSONSerialization.JSONObjectWithData(JSONData, options: NSJSONReadingOptions()) as? Array
 catch 
    print(error)


var resultArray = [String]()
for item in json 
    if let content = item["content"] as? String 
        resultArray.append(content)
    

print("resultArray: \(resultArray)")

【讨论】:

【参考方案2】:
//: Playground - noun: a place where people can play

import UIKit

var str:String = "[\"xx\",\"yy\",\"zz\"]"

let data = str.dataUsingEncoding(NSUTF8StringEncoding)

do 
    var jsondata = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions()) as! NSArray
 catch 
    print(error)

(抱歉,示例现在可以在操场上使用)

【讨论】:

谢谢,这段代码有效,但不是我需要的。我只想显示“内容”值(来自我上面问题的 Json 数据)!【参考方案3】:

您上面的代码 sn-p 将无法编译,因为您需要转义内部引号。

这就是你想要的:

//: Playground - noun: a place where people can play

import UIKit
import Foundation

func arrayFromJSON(jsonString: String) -> [String]?
        
    if let data = jsonString.dataUsingEncoding(NSUTF8StringEncoding)
    
        if let array = try? NSJSONSerialization.JSONObjectWithData(data, options: []) as! [[NSObject:AnyObject]]
        
            return array.map  $0["content"] as! String 
        
    
    return nil // If the string isn't valid JSON



let jsonString = "[\"content\":\"hello\",\"content\":\"hi\",\"content\":\"how are you?\"]"

print(arrayFromJSON(jsonString))

【讨论】:

我知道应该避免这种情况,但谢谢。这对我很有帮助。 永远不要将 JSON 解码为字符串或从字符串解码。 JSON 总是以数据而不是字符串的形式出现,因此您唯一转换字符串的时候是有人愚蠢地将数据转换为字符串。 “allowLossyConversion”到底在做什么?如果有任何问题,那么转换必须、绝对必须失败。 @gasher729 我不知道有一种方法可以将 json 解码为字符串以外的东西。你会怎么做? @gasher729 请解释为什么您认为永远不应该从字符串中解码 JSON。 JSON 是一种文本格式,因此接受字符串作为输入似乎没有问题,尤其是在编码没有问题的 Swift 中。至于allowLossyConversion: false,我不确定你的问题是什么,除非这个论点可能是多余的。我会编辑答案。

以上是关于Swift 中的特殊 JSON 解析 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 Appdelegate 中解析的 JSON [关闭]

Swift 3 中的 JSON 解析

Swift 中的 JSON 解析

JSON 解析 --> Swift | JSON 写入中的***类型无效

如何正确解析 SWIFT 中的 JSON 对象

Swift 中的 JSON 解析(iOS)