Changer l'ordre d'encodage avec JSONEncoder

Bonjour,

Voilà, je me trouve dans une situation que je ne comprends pas bien. Je travail sur un projet personnel utilisant une API libre. Pour pouvoir accéder à certaines fonctionnalités, l’utilisateur doit s’identifier.

J’ai donc besoin d’envoyer des informations au format JSON sous la forme et dans l’ordre suivant :

{
  "username": "johnny_appleseed",
  "password": "test123",
  "request_token": "1531f1a558c8357ce8990cf887ff196e8f5402ec"
}

Voilà donc ce que j’ai utilisé pour cette opération :

import Foundation

struct Session: Codable {
    let username: String
    let password: String
    let request_token: String
}

let session = Session(
    username: "johnny_appleseed",
    password: "test123",
    request_token: "1531f1a558c8357ce8990cf887ff196e8f5402ec")

let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted

let body = try encoder.encode(session)

Seulement le retour de ceci me créé le JSON dans l’ordre suivant :

{
  "request_token" : "1531f1a558c8357ce8990cf887ff196e8f5402ec",
  "username" : "johnny_appleseed",
  "password" : "test123"
}

Est-ce que l’un d’entre vous a une idée de la raison de ce changement d’ordre et comment y remédier?

peut-être un effet du .prettyPrinted ? Je n’en ai aucune idée, mais la réponse m’intéresse.

Non le .prettyPrinted est là uniquement pour la mise en forme ce qui facilite la lecture lors des print par exemple. Et même sans, cela ne change rien.

Il n’y a pas de notion d’ordre dans les tableaux clés-valeurs et dans les objets JSON. Les clés peuvent être mélangées sans soucis puisqu’on y accède par nom et non par index.

Est-ce que ça te pose un problème d’utilisation particulier ?

Pourquoi ce mélange a lieu ?

Je n’ai pas regardé en détail le code de JSONEncoder (sources accessible ici) mais je suppose qu’ils doivent d’abord déposer les objets dans un Dictionary, Set ou équivalent, et ensuite ils font la transformation. Ces structures de données stockent les informations de la façon la plus optimisée possible pour faciliter les ajouts et les lectures futures. Ils peuvent utiliser en interne des tableaux, des listes chaînées, des arbres, etc.
Il est donc tout à fait possible qu’il dépose les noms de tes propriétés dans un Set/Dictionary dans un certain ordre au début, puis lors de l’encodage, il relit les données depuis le même Set/Dictionary qui les donne dans un ordre différent.

Merci Maxime pour ces explications.

J’ai effectivement un soucis lors de l’envoi de mes données en JSON vers l’API. Celle-ci me retourne le message suivant:
« Invalid parameters: Your request parameters are incorrect. »
Et le status code est 422 (pas sûr que cela soit une information importante pour ce problème).

Ce retour n’est alors peut-être pas lié à mon JSON mais à autre chose? Pourtant cela me semble correct. Je vais continuer à chercher.

En effet ça n’est probablement pas lié à ça. Vérifie la doc de l’API que tu utilises, et particulièrement ces 4 points :

  • l’URL
  • la méthode (GET, POST, PUT, PATCH, …)
  • les entêtes
  • le corps
1 « J'aime »

Je reviens vous donner des nouvelles de mon problème.

Effectivement l’erreur venait de moi (vous me direz que l’erreur provient toujours de celui qui code…). Tu avais tout à fait raison Maxime, mes paramètres n’étaient pas bon. J’ai quand même cherché un moment et à force de modifier, mon « username » était devenu « user » donc cela ne fonctionnait pas.

Bref, comme à chaque fois, les erreurs sont formatrices. Cela m’a permis d’être beaucoup plus à l’aise avec les requête Http et les conversions en JSON.

Je confirme également que l’ordre d’encodage n’a effectivement aucun impact. Croyant que l’erreur venait de là, j’ai créé manuellement mon JSON et lorsque je m’amuse à changer l’ordre tout fonctionne pareil.

Je suis content d’avoir enfin pu me sortir de cette situation grâce à votre aide et vos pistes de réflexions. Encore merci à vous 2.

Bonne journée.

1 « J'aime »

Merci pour ton retour Christophe! L’avantage comme tu le dis c’est que ça t’a permis de mieux comprendre les requêtes HTTP.
C’est un point essentiel en programmation mobile et maintenant tu sera beaucoup plus efficace pour lire et utiliser ces API :+1:

Happy coding!