SWIFT3 JSON NSNull问题

时间:2017-08-05 13:10:57

标签: json swift3

我有以下swift3代码。 JSON可以返回$ 0 [2]值的NSNull值。

struct Player3 {
    let name : String
    var score : String
    let avatar : String
}

class HistoricLeagueVC: UITableViewController {

    var players = [Player3]()

    override func viewDidLoad() {
        super.viewDidLoad()



        let urlString = "https://str8red.com/jsonoverallleaderboard/1025/"

        let url = URL(string: urlString)
        URLSession.shared.dataTask(with:url!) { (data, response, error) in
            if error != nil {
                print("there was an error")
            } else {
                do {
                    let parsedData = try JSONSerialization.jsonObject(with: data!) as! [[String]]

                    self.players = parsedData.map { Player3(name: $0[0], score: $0[1], avatar: $0[2]) }

                    print(self.players.count)
                    DispatchQueue.main.async {
                        self.tableView.reloadData()
                    }

                } catch let error as NSError {
                    print(error)
                }
            }

            }.resume()

    }

我试图将其转换为空字符串但没有成功。我还尝试设置一个默认字符串,例如"https://str8red.com/static/no_profile_picture.png",理想情况下我想这样做。

终端中的错误说明Could not cast value of type 'NSNull' (0xed1c78) to 'NSString' (0x57b6b8).

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

不要强制转换为<?php if (isset($_POST['submit'])) { // Checking for submit form $my_email = 'roni.itzhaik@gmail.com'; // Change with your email address if ($_POST['submit'] == 'add') { $name = trim(strip_tags(addslashes($_POST['name']))); $email = trim(strip_tags(addslashes($_POST['email']))); $message = trim(strip_tags(addslashes($_POST['message']))); $phone = trim(strip_tags(addslashes($_POST['phone']))); $pattern_name = '/^[a-zA-Z]{2}/'; $pattern_email = '/^[^\W][a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)*\@[a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)*\.[a-zA-Z]{2,4}$/'; $pattern_message = '/^[a-zA-Z0-9]{2}/'; $pattern_phone = '/^([0-9]{9,10})/'; if ($email != '' && $message != '' && $phone != ''&& $name != '') { if (preg_match($pattern_email, $email)&& preg_match($pattern_name, $name)&& preg_match($pattern_message, $message)&& preg_match($pattern_phone, $phone) ) { $headers = 'From: ' . $email . "\r\n"; $subject = 'Message from ' . $name; $message_phone= $message.'Phone number: '.$phone; mail($my_email, $subject, $message_phone, $headers); echo 'success|<div class="alert alert-success"><button type="button" class="close" data-dismiss="alert"><i class="ion-close"></i></button>Thank you! We will contact you shortly.</div>'; } elseif(!preg_match($pattern_email, $email)) { echo 'error|<div class="email_error"></i></button>Please enter a valid email address.</div>'; } elseif(!preg_match($pattern_name, $name)) { echo 'error|<div class="alert alert-danger"><button type="button" class="close" data-dismiss="alert"><i class="ion-close"></i></button>Name must be more then 2 letters.</div>'; } elseif(!preg_match($pattern_phone, $phone)) { echo 'error|<div class="phone_error"></i></button>Phone must be 9-10 digits.</div>'; } elseif(!preg_match($pattern_message, $message)) { echo 'error|<div class="alert alert-danger"><button type="button" class="close" data-dismiss="alert"><i class="ion-close"></i></button>Message must be more than 2 letters.</div>'; } } elseif ($name== ''&& $message != '' && $phone != '' && $email != '') { echo 'error|<div class="alert alert-danger"><button type="button" class="close" data-dismiss="alert"><i class="ion-close"></i></button>Please fill name</div>'; } elseif ($phone== ''&& $message != '' && $name != '' && $email != '') { echo 'error|<div class="alert alert-danger"><button type="button" class="close" data-dismiss="alert"><i class="ion-close"></i></button>Please fill Phone number</div>'; } elseif ($message== '' && $phone != ''&& $name != '' && $email != '') { echo 'error|<div class="alert alert-danger"><button type="button" class="close" data-dismiss="alert"><i class="ion-close"></i></button>Please fill Massage</div>'; } elseif ($email== ''&& $message != '' && $phone != ''&& $name != '') { echo 'error|<div class="alert alert-danger"><button type="button" class="close" data-dismiss="alert"><i class="ion-close"></i></button>Please fill Email address</div>'; } else{ echo 'error|<div class="alert alert-danger"><button type="button" class="close" data-dismiss="alert"><i class="ion-close"></i></button>Please fill all the fields</div>'; } } } else { // Submit form false header('Location: index.html'); } ?>

 <form class="x-contact-form" style="max-width: 300px; margin: 10px">
 <div class="form-group name-group">
<label>Name</label>
<input class="form-control" name="name" data-rule="required|min:2|max:254" 
 />
<span id="name_error" class="text-danger"></span>
</div>
<div class="form-group email-group">
<label>Email</label>
<input class="form-control" name="email" data-rule="required|email|max:254" 
 />
<span id="email_error" class="text-danger"></span>
</div>
<div class="form-group phone-group">
<label>Phone</label>
<input class="form-control" name="phone" data-rule="required|min:9|max:10" 
 />
 <span id="phone_error" class="text-danger"></span>
  </div>
 <div class="form-group message-group">
   <label>Message</label>
<textarea class="form-control" name="message" data-
 rule="required|min:2|max:254"></textarea>
<span id="message_error" class="text-danger"></span>
 </div>
 <input type="submit" class="btn btn-primary" id="btn" value="Send" />
 </form>

你甚至应该[[String]]以更安全的方式做事(使用let parsedData = try JSONSerialization.jsonObject(with: data!) as! [[Any]] self.players = parsedData.map { Player3( name: ($0[0] as? String) ?? "", score: ($0[1] as? String) ?? "", avatar: $0[2] as? String, // keeping `nil` here )} ),但上述方法可行。

答案 1 :(得分:0)

如果您的输入数据出现任何问题,您的代码将会崩溃。问问你的老板他或她是否还好。我不会。以下是崩溃的方法:如果data == nil(但不应该是error == nil)。您可以发现无法在不崩溃的情况下解析数据的问题。如果数据不解析为数组,则崩溃,如果数组的元素不是所有数组,则崩溃,如果内部数组中的元素不是所有字符串,则崩溃,如果任何内部数组包含两个,则崩溃或更少的字符串。我认为这是非常不可接受的。

我的策略是:如果无法解析响应或不是数组数组,则忽略它,保持self.players不变。如果有一个数组数组,重置self.players,然后为每个包含至少三个项目的数组添加一个播放器,其中前两个必须是字符串。

guard data != nil else { return }
guard let parsed = try? NSJSONSerialization(with: data!) else { return }
guard let arrays = parsed as? [[Any]] else { return }

self.players.removeAll()
for array in arrays {
    guard array.count >= 3,
    let name = array [0] as? String, 
    let score = array [1] as? String else { continue }
    let avatar = array [2] as? String ?? ""
    self.players.append(Player3 (name: name, score: score, avatar: avatar))
}

将这样的东西移到一个单独的方法中是个好主意。添加您认为合适的错误处理或日志记录。