快速解析 Json

Posted

技术标签:

【中文标题】快速解析 Json【英文标题】:Json Parsing on swift 【发布时间】:2017-06-19 11:49:01 【问题描述】:

您好,我对 ios 编程很陌生。我必须使用 api 登录并获取“成员数据”并显示它。 这是我到目前为止所拥有的:

 @IBAction func loginButton(_ sender: Any) 


       let usr = usernameTextField.text
      let pwdCode = passwordTextField.text
let iturl = NSURL(string: "something?UserName=\(usr!)&Password=\(pwdCode!)")


            let session = URLSession.shared
              var request = URLRequest(url: iturl as! URL)
            do 

                let auth = try JSONSerialization.data(withJSONObject: login, options: .prettyPrinted)
               request.setValue("application/json", forHTTPHeaderField: "Content-Type")
                   request.httpMethod = "POST"
                    request.httpBody = auth

                let task = session.dataTask(with: request as URLRequest, completionHandler:  (data, response, error) -> Void in
                    print("Got data \(data)  response: \(response)with error \(error)")
                    print("Done.")
                )task.resume()

在回复中我收到了这个

 Got data Optional(41 bytes)
response: Optional(<NSHTTPURLResponse: 0x608000228760>  URL: something   status code: 200, headers 
        "Cache-Control" = "s-maxage=0";
        "Content-Encoding" = gzip;
        "Content-Security-Policy" = "referrer origin-when-cross-origin";
        "Content-Type" = "application/json;charset=UTF-8";
        Date = "Mon, 19 Jun 2017 07:08:33 GMT";
        "Transfer-Encoding" = Identity;
        Vary = "Accept-Encoding";
        "X-XSS-Protection" = "1; mode=block";
     ) with error nil
Done.

这是 url 给出的 Json 响应:

  
   "nonprimary":null,
   "memtier":[  

   ],
   "memcard":[  
        
         "attributes":  
            "type":"Membership_card__c",
            "url":"/services/data/v37.0/something"
         ,
         "Effective_End_Date__c":"2018-04-13",
         "Effective_Start_Date__c":"2017-04-13",
         "Member__c":"a0A2800000Psomething",
         "Id":"a0B28000something"
      
   ],
   "member":  
      "attributes":  
         "type":"Member__c",
         "url":"/services/data/v37.0/sobjects/something"
      ,
      "Contact__c":"0032800000wk79XAAQ",
      "Enrollment_Channel__c":"Web",
      "Registered_date__c":"2017-04-13",
      "Name":"something",
      "Member_Image__c":"<img src=\"https://ap2something" width=\"300\" height=\"281\"></img>",
      "Member_Number__c":"000000974",
      "Membership_Card__c":"a0B2800000IJPn7EAH",
      "Member_Tier__c":"Ruby",
      "Member_Type__c":"Individual",
      "Points__c":1656009,
      "Program__c":"a0G2800000jXisqEAC",
      "Status__c":"Active",
      "Tier__c":"a0P2800000AKJxMEAX",
      "Id":"a0A2800000PM4DlEAL"
   ,
   "contact":null,
   "account":  
      "attributes":  
         "type":"Account",
         "url":"/services/datasomethingSZyxAAH"
      ,
      "Name":"something",
      "FirstName":"somethingd",
      "LastName":"somethingir",
      "PersonEmail":"somethingr@gmail.com",
      "PersonHasOptedOutOfEmail":false,
      "PersonMailingStreet":"something ",
      "PersonBirthdate":"1992-07-19",
      "Passport__c":"JHdd546TG",
      "PersonMailingCountry":"Saudi Arabia",
      "PersonMailingCity":"Jeddah",
      "PersonMobilePhone":"+9667887575763",
      "National_ID__c":"P435345",
      "PersonDoNotCall":false,
      "Id":"0012800001FSZyxAAH"
   

这是我的最终实现应该有的:

你好(人名),你的卡号(会员卡)你是类型(Member_Type__c)并且有积分(Points__c)

有人可以指点我一个教程或给我一些资源来了解如何实施下一步吗?

谢谢。

【问题讨论】:

使用JSONSerialization()data(而不是response)转换为JSON。然后 JSON 它只是字典和数组。 你是说我打印的时候吗?我编辑添加它。我只得到“41 个字节” @user161993 您向我们询问完整代码,而不是您应该尝试一些方法 1. 使用 JSONSerialization 解析数据。 2.搜索如何从json中获取具体的key值。 不,我根本不想在复制粘贴中实现。我只想知道我的下一步应该是什么。谢谢。 是的,我将创建一个函数并在按钮上调用它。感谢您的意见! 【参考方案1】:

如果您想获取成员详细信息,则可以尝试此示例。抱歉,我使用了您的文件而不是 URL 链接。

do
            let file = Bundle.main.url(forResource: "JsonFile", withExtension: "json"); //Get file
            let data = try Data(contentsOf: file!); //Get content of file

            let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! [String:Any]; // Get data as json object

            for data in json["member"] as! [String: Any]
                print(data.value)


            

        catch let err
            print(err);
        

输出:

2017-04-13
Web
000000974
Individual
Active
1656009
a0A2800000PM4DlEAL
Ruby
<img src="https://ap2something

    type = "Member__c";
    url = "/services/data/v37.0/sobjects/something";

something
0032800000wk79XAAQ
a0B2800000IJPn7EAH
a0P2800000AKJxMEAX
a0G2800000jXisqEAC

对于 URL,您可以使用以下示例

URLSession.shared.dataTask(with: "some url")  (data, response, error) in
                    if error != nil //If error has some value then return
                        print(error);
                        return;
                    

                    do
                        let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! [String:Any];
                        for data in json["member"] as! [String: Any]
                            print(data.value)
                        

                    
                

【讨论】:

我想获取会员详细信息。所以现在既然我得到了回复,我就知道凭据被拿走了,而且他们是对的。我该如何从这里开始? 您的 JSON 文件是否正常?你想从文件或 URL 中读取它吗? 是的,我也尝试过类似的方法。 paste.ofcode.org/376r2tFDNzXxEyLG8ybz8bg 我收到错误从“(_, _, _) throws -> Void”类型的抛出函数到非抛出函数类型“(Data?, URLResponse?, Error?) -> Void”的无效转换。我错过了什么吗? @比克拉姆 我发现您的 JSON 响应不正确。检查您的 JSON 文件,问题应该得到解决。如果这解决了您的问题,那么请接受答案。 这给了我一个指针来检查我的代码。你是对的,我犯了一个错误。我没有复制这个答案,但它确实让我看到了我犯的错误。谢谢。【参考方案2】:
           if let data = data,
            let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] 
            for case let result in json["Key"] 



                
            
        

【讨论】:

你能解释一下吗?它是否在这个 let task = session.dataTask 之下,并且“Key”会说“FirstName”,然后我只是关联它 cell.title? 你要解析哪些数据如:member,contact,contact。 是的,在发帖之前我试过了。我得到了这个错误 domain=nscocoaerrordomain code=3840 这就是我想要解释的原因,也许我错过了什么。

以上是关于快速解析 Json的主要内容,如果未能解决你的问题,请参考以下文章

快速解析json

快速解析 Json

如何快速解析这个特定的 json

python json快速解析命令

快速解析动态键的json响应问题

如何快速解析这个 JSON 数据