首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Swift 3进行JSON分析

使用Swift 3进行JSON分析
EN

Stack Overflow用户
提问于 2017-06-08 09:24:05
回答 4查看 296关注 0票数 2

我在我的应用程序中调用一个soap服务。我从服务器获得JSON的响应

代码语言:javascript
复制
{  
  "CustomerName":"Muneer Ahmad/ Ejaz Ahmad (User)  ",
  "IsCorporate":false,
  "ID":48,
  "Name":"Muneer Ahmad/ Ejaz Ahmad (User)  ",
  "GroupID":null,
  "GroupName":null,
  "CustomerID":48
}

我尝试过在线教程的建议,但我无法解析数据。它给我的错误是“字符0周围的无效值”。我的密码是

代码语言:javascript
复制
 let is_URL: String = "http://labs2.unitedtracker.com/WTService.asmx?op=GetTerminalNumber"

    let lobj_Request = NSMutableURLRequest(url: NSURL(string: is_URL)! as URL)
    let session = URLSession.shared

    lobj_Request.httpMethod = "POST"
    lobj_Request.httpBody = is_SoapMessage.data(using: String.Encoding.utf8)
    lobj_Request.addValue("labs2.unitedtracker.com", forHTTPHeaderField: "Host")
    lobj_Request.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
    lobj_Request.addValue(String(is_SoapMessage.characters.count), forHTTPHeaderField: "Content-Length")
    lobj_Request.addValue("http://tempuri.org/GetTerminalNumber", forHTTPHeaderField: "SOAPAction")

    let task = session.dataTask(with: lobj_Request as URLRequest, completionHandler: {data, response, error -> Void in

        do {
            if let data = data,
                let json = try JSONSerialization.jsonObject(with: data) as? [String: Any],
                let customerID = json["CustomerID"] as? [[String: Any]] {
                print(customerID)
            }
        } catch {
            print("Error deserializing JSON: \(error)")
        }

        if error != nil
        {
            print("Error: " + String(describing: error))
        }
    })
    task.resume()

有人能告诉我我在做什么不对吗?应该如何解析Soap服务的JSON响应。

以下是来自我的服务器的完整响应。

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><GetAuthenticateUserResponse xmlns="http://tempuri.org/"><GetAuthenticateUserResult>[{"CustomerName":"Muneer Ahmad/ Ejaz Ahmad (User)  ","IsCorporate":false,"ID":48,"Name":"Muneer Ahmad/ Ejaz Ahmad (User)  ","GroupID":null,"GroupName":null,"CustomerID":48}]</GetAuthenticateUserResult></GetAuthenticateUserResponse></soap:Body></soap:Envelope>
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-06-08 09:32:58

代码语言:javascript
复制
lobj_Request.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type")

如何保证服务器将返回json作为响应?它似乎将返回text/xml作为响应。

关于JSON解析,我建议使用SwiftyJSON

更多建议

几年前,我曾经使用过soap客户端引擎,它会将wsdl解析为objective-c代码。今天,也许有些工具可以帮助您从Swift生成wsdl代码,以便与soap服务器进行通信。

关于wsdl到快速客户端生成器

票数 1
EN

Stack Overflow用户

发布于 2017-06-08 11:38:59

问题是您从服务器接收XML并尝试将其解析为JSON。您必须首先从XML信封中提取JSON有效负载。以下是整个回应:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <GetAuthenticateUserResponse xmlns="http://tempuri.org/">
      <GetAuthenticateUserResult>[{"CustomerName":"Muneer Ahmad/ Ejaz Ahmad (User)  ","IsCorporate":false,"ID":48,"Name":"Muneer Ahmad/ Ejaz Ahmad (User)  ","GroupID":null,"GroupName":null,"CustomerID":48}]</GetAuthenticateUserResult>
    </GetAuthenticateUserResponse>
  </soap:Body>
</soap:Envelope>

您需要将<GetAuthenticateUserResult>标记的内容提取为字符串,只有这样,您才能使用NSJSONSerialization来解析该内容。有点像这样:

代码语言:javascript
复制
class Extractor: NSObject, XMLParserDelegate {

    var payload = ""
    private var recording = false
    let wantedElement = "GetAuthenticateUserResult"

    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?,
        qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
        if elementName == wantedElement {
            recording = true
        }
    }

    func parser(_ parser: XMLParser, foundCharacters string: String) {
        if recording {
            payload += string
        }
    }

    func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
        recording = false
    }
}

let response = "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><soap:Body><GetAuthenticateUserResponse xmlns=\"http://tempuri.org/\"><GetAuthenticateUserResult>[{\"CustomerName\":\"Muneer Ahmad/ Ejaz Ahmad (User)\",\"IsCorporate\":false,\"ID\":48,\"Name\":\"Muneer Ahmad/ Ejaz Ahmad (User)  \",\"GroupID\":null,\"GroupName\":null,\"CustomerID\":48}]</GetAuthenticateUserResult></GetAuthenticateUserResponse></soap:Body></soap:Envelope>"
let parser = XMLParser(data: response.data(using: .utf8)!)
let extractor = Extractor()
parser.delegate = extractor
parser.parse()
let payload = extractor.payload
let parsedPayload = try? JSONSerialization.jsonObject(with: payload.data(using: .utf8)!, options: [])

这给了你:

代码语言:javascript
复制
{
    CustomerID = 48;
    CustomerName = "Muneer Ahmad/ Ejaz Ahmad (User)";
    GroupID = "<null>";
    GroupName = "<null>";
    ID = 48;
    IsCorporate = 0;
    Name = "Muneer Ahmad/ Ejaz Ahmad (User)  ";
}

XML提取代码有点愚蠢,因为我不知道有什么更好的内置XML解析器。

票数 1
EN

Stack Overflow用户

发布于 2017-06-08 09:38:58

你的代码:

代码语言:javascript
复制
let customerID = json["CustomerID"] as? [[String: Any]] {
    print(customerID)
}

customerID视为字典而不是字符串。

它应该是:

代码语言:javascript
复制
let customerID = json["CustomerID"] as? String {
    print(customerID)
}

您应该使用另一种网络请求和JSON解析器的方式,比如阿拉莫火与AlamofireObjectMapper

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44431683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档