Actuellement, je travaille sur le module de réservation de bus. Après l'utilisateur, l'utilisateur a défini son départ et son arrivée et sa date de voyage, l'utilisateur sera affiché une liste des bus disponibles. J'ai fait cette partie avec succès. Mais le problème que je suis confronté est que chaque bus a sa propre politique d'annulation qui est une gamme de dictionnaire à l'intérieur de la chaîne. Je suis incapable de l'analyser. À l'intérieur de chaque dictionnaire des "apiavailablebus", il existe une clé "Annellationpolicy" qui a une chaîne en tant que valeur contenant une gamme de dictionnaire. J'ai supprimé d'autres paires de la valeur clé à partir de "Apiavailablebuses".
Liste des bus disponibles JSON Réponse: P>
"apiAvailableBuses":[
{
"cancellationPolicy":"[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
},
{
"cancellationPolicy":"[{\"cutoffTime\":\"9-12\",\"refundInPercentage\":\"25\"},{\"cutoffTime\":\"12-24\",\"refundInPercentage\":\"35\"},{\"cutoffTime\":\"24-48\",\"refundInPercentage\":\"50\"},{\"cutoffTime\":\"48-60\",\"refundInPercentage\":\"75\"},{\"cutoffTime\":\"60\",\"refundInPercentage\":\"90\"}]"
},
{
"cancellationPolicy":"[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
},
{
"cancellationPolicy":"[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
},
{
"cancellationPolicy":"[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
},
{
"cancellationPolicy":"[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
},
{
"cancellationPolicy":"[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
},
{
"cancellationPolicy":"[{\"cutoffTime\":\"6-24\",\"refundInPercentage\":\"70\"},{\"cutoffTime\":\"24\",\"refundInPercentage\":\"85\"}]"
}
]
3 Réponses :
Vous pouvez analyser la chaîne JSON en utilisant la méthode suivante:
// JSON Format
let jsonResponse = ["apiAvailableBuses": [
[
"cancellationPolicy": "[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
],
[
"cancellationPolicy": "[{\"cutoffTime\":\"9-12\",\"refundInPercentage\":\"25\"},{\"cutoffTime\":\"12-24\",\"refundInPercentage\":\"35\"},{\"cutoffTime\":\"24-48\",\"refundInPercentage\":\"50\"},{\"cutoffTime\":\"48-60\",\"refundInPercentage\":\"75\"},{\"cutoffTime\":\"60\",\"refundInPercentage\":\"90\"}]"
],
[
"cancellationPolicy": "[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
],
[
"cancellationPolicy": "[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
],
[
"cancellationPolicy": "[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
],
[
"cancellationPolicy": "[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
],
[
"cancellationPolicy": "[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
],
[
"cancellationPolicy": "[{\"cutoffTime\":\"6-24\",\"refundInPercentage\":\"70\"},{\"cutoffTime\":\"24\",\"refundInPercentage\":\"85\"}]"
]
]
]
// Function Calling
setBuses(json: jsonResponse)
// Function to Parse JSON
func setBuses(json: Dictionary<String,Any>) {
guard let buses = json["apiAvailableBuses"] as? [Dictionary<String,Any>] else { return }
for (index, bus) in buses.enumerated() {
print("\n\nBus #\(index+1)")
guard let policies = convertToDictionary(text: bus["cancellationPolicy"] as! String) else { return }
for (index, policy) in policies.enumerated() {
print("\nPolicy #\(index+1)")
print("cutoffTime #\(index+1) \(String(describing: policy["refundInPercentage"]))")
print("refundInPercentage #\(index+1) \(String(describing: policy["cutoffTime"]))")
}
}
}
func convertToDictionary(text: String) -> [Dictionary<String,Any>]? {
let data = text.data(using: .utf8)!
do {
if let jsonObj = try JSONSerialization.jsonObject(with: data, options : .allowFragments) as? [Dictionary<String,Any>] {
return jsonObj
} else {
print("JSON Error")
}
} catch let error as NSError {
print(error)
}
return nil
}
Salut Bhavik, la touche "CANCellationPolicy" est à l'intérieur "ApiavailableBuses" qui est à nouveau un tableau de dictionnaire. Comment puis-je obtenir une valeur de chaîne de la touche "CANCellationPolicy".
Vous pouvez obtenir cela par une analyse normale JSON.
J'ai mis à jour ma question. Nous n'utilisons pas de codable dans le projet.
@Yashjadhav vérifier la réponse mise à jour. Cela vous aidera à analyser JSON à votre objet de modèle personnalisé.
Bonjour BHAVIK, la fonction convertidictionner est manquante dans la solution.
@Yashjadhav désolé mate! mis à jour la même chose. Vérifiez s'il vous plaît.
Laissez-nous Continuez cette discussion en chat .
Utilisez Si votre codable code> strud> pour analyser la réponse JSON ci-dessus code>. JSON Response code> Format: P> if let data = jsonStr.data(using: .utf8) {
do {
let availableBuses = try JSONDecoder().decode(AvailableBuses.self, from: data)
print(availableBuses)
} catch {
print(error)
}
}
Bonjour, je n'ai pas utilisé de codage dans mon projet. Donc, la solution peut-elle être atteinte sans utiliser de codacble?
Si vous ne l'avez pas fait, vous devez maintenant. Parce que c'est le ce qui est recommandé et est très efficace et facile à utiliser que d'autres solutions.
Vous avez raison. Mais en utilisant Codable uniquement pour celui-ci, un problème dans son projet n'est pas correct. C'est la raison pour laquelle je cherche une solution autre que d'utilisation codable.
@Yashjadhav codable fait partie de la fondation et donc intégrée, alors pourquoi ne serait-il pas correct de l'utiliser?
La valeur de Annellationpolicy code> est une chaîne de chaîne , une chaîne JSON imbriquée, pas une gamme de dictionnaires.
Si vous ne voulez pas utiliser codable code> pour une raison quelconque, vous pouvez utiliser jsonserialization code>. let input = "[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
let data = input.data(using: .utf8)!
let parsed = try! JSONSerialization.jsonObject(with: data, options: []) as! Array<Dictionary<String, Any>>
print(parsed) // [["refundInPercentage": 90, "cutoffTime": 5]]
HI @wvteijlingen, la touche "CANCellationPolicy" est dans "ApiavailableBuses" qui est une gamme de dictionnaire. Comment puis-je obtenir une valeur de chaîne de la touche "CANCellationPolicy".
Je pense que la clé
annnelationpolicy code> contient json-string. Vous pouvez désérialiser Json-String et utiliser.Êtes-vous responsable du backend? Si oui, envoyez un dictionnaire plutôt que d'une chaîne JSON imbriquée qui doit être de deuxième niveau-désérialisée i>
Bonjour @vadian, nous utilisons des API d'une tierce partie qui fournit des API de réservation de bus.
Ensuite, rendez-la plus compréhensible en ajoutant du code pour montrer ce que vous avez essayé jusqu'à présent et nous pouvons donc voir s'il y a des problèmes avec cela.