简体   繁体   English

如何快速从json数据中获取特定值

[英]How to get a specific value from json data in swift

I am trying to pull a certain value from a json. 我试图从json中提取某个值。 In this case I am trying to get the value of 'isethanawake' which should be 1 in this case from: 在这种情况下,我尝试从以下示例中获取“ isethanawake”的值,该值应为1:

Optional([{"isethanawake":1,"name":"Ethan"},{"ismadisonawake":0,"name":"Madison"},{"ismomawake":0,"name":"Mom"},{"isdadawake":0,"name":"Dad"}] 可选([[{“ isethanawake”:1,“ name”:“ Ethan”},{“ ismadisonawake”:0,“ name”:“ Madison”},{“ ismomawake”:0,“ name”:“ Mom”} ,{“ isdadawake”:0:“ name”:“ Dad”}]

Here is the code I have and it is not setting the variable to 1 这是我的代码,它没有将变量设置为1

var isethanawake = 0
var ismadisonawake = 0
var ismomawake = 0
var isdadawake = 0

request2.httpBody = postString2.data(using: String.Encoding.utf8)

let task2 = URLSession.shared.dataTask(with: request2 as URLRequest){
    data, response, error in

    if error != nil{
        print("error = \(error)")
        return
    }

    print("response = \(response)")

    let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
    print("responseString = \(responseString)")

    do{
        let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary

        if let parseJSON1 = json {
            isethanawake = parseJSON1["isethanawake"] as! Int

        }
        if let parseJSON2 = json{
            ismadisonawake = parseJSON2["ismadisonawake"] as! Int
        }


        if let parseJSON3 = json{
            ismomawake = parseJSON3["ismomawake"] as! Int
        }

        if let parseJSON4 = json{
            isdadawake = parseJSON4["isdadawake"] as! Int
        }

        print("hello" + String(isethanawake))
    }catch{
        print(error)
    }

It is getting the data from this php script: 它是从以下php脚本获取数据的:

$jsonarray = array();

if(mysqli_num_rows($ethanresult)){
    $returnValue1 = array("isethanawake"=> 1, "name"=> "Ethan");
    array_push($jsonarray, $returnValue1);
}else{
    $returnValue1 = array("isethanawake"=> 0, "name"=> "Ethan");
    array_push($jsonarray, $returnValue1);
}
if(mysqli_num_rows($madisonresult)){
    $returnValue2 = array("ismadisonawake"=> 1, "name"=> "Madison");
    array_push($jsonarray, $returnValue2);
}else{
    $returnValue2 = array("ismadisonawake"=> 0, "name"=> "Madison");
    array_push($jsonarray, $returnValue2);
}
if(mysqli_num_rows($momresult)){
    $returnValue3 = array("ismomawake"=> 1, "name"=> "Mom");
    array_push($jsonarray, $returnValue3);
}else{
    $returnValue3 = array("ismomawake"=> 0, "name"=> "Mom");
    array_push($jsonarray, $returnValue3);
}
if(mysqli_num_rows($dadresult)){
    $returnValue4 = array("isdadawake"=> 1, "name"=> "Dad");
    array_push($jsonarray, $returnValue4);
}else{
    $returnValue4 = array("isdadawake"=> 0, "name"=> "Dad");
    array_push($jsonarray, $returnValue4);

}
echo json_encode($jsonarray);

}

Thanks 谢谢

As you said your your JSON structure is: 如您所说,您的JSON结构为:

Optional([{"isethanawake":1,"name":"Ethan"},{"ismadisonawake":0,"name":"Madison"},{"ismomawake":0,"name":"Mom"},{"isdadawake":0,"name":"Dad"}] 可选([[{“ isethanawake”:1,“ name”:“ Ethan”},{“ ismadisonawake”:0,“ name”:“ Madison”},{“ ismomawake”:0,“ name”:“ Mom”} ,{“ isdadawake”:0:“ name”:“ Dad”}]

In Swift json will be of type [[String:Any]]?. 在Swift中,json的类型将为[[String:Any]]?。 That means you have an Array of Dictionarys. 这意味着您有一个词典数组。 The error tells you can't subscript an array with a String. 该错误表明您无法使用String下标数组。 That means that you need to loop through your son Array to do the code you want to: 这意味着您需要遍历子数组来执行您想要的代码:

 do{
        let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary

if let json as? [[String: Any]]{
for arrayJSONObj in json {


            isethanawake = arrayJSONObj["isethanawake"] as? Int ?? 0

            ismadisonawake = arrayJSONObj["ismadisonawake"] as? Int ?? 0

            ismomawake = arrayJSONObj["ismomawake"] as? Int ?? 0

            isdadawake = arrayJSONObj["isdadawake"] as? Int ?? 0

}
}
        print("hello" + String(isethanawake))
    }catch{
        print(error)
    }

I also do recommend using default values to your values (these two ??) instead of force unwrapping them to prevent your app from crashing. 我也建议您为您的值(这两个??)使用默认值,而不是强行解开默认值以防止您的应用崩溃。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM