快速解析 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的主要内容,如果未能解决你的问题,请参考以下文章