-2
votes

Impossible d'analyser le tableau de dictionnaire à l'intérieur de la chaîne

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\"}]"
   }
]


4 commentaires

Je pense que la clé annnelationpolicy 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


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.


3 Réponses :


0
votes

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
}


7 commentaires

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 .



0
votes

Utilisez codable code> strud> pour analyser la réponse JSON ci-dessus code>.

Si votre 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)
    }
}


5 commentaires

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 est une chaîne de chaîne , une chaîne JSON imbriquée, pas une gamme de dictionnaires.



0
votes

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]]


1 commentaires

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".