Afficher la liste des noms d'entreprise (réponse api)

turtle123 Messages postés 5 Date d'inscription jeudi 16 février 2023 Statut Membre Dernière intervention 17 février 2023 - Modifié le 16 févr. 2023 à 18:09
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 - 17 févr. 2023 à 19:47

Bonjour à ceux qui lisent cette demande, j'aimerai savoir si quelqu'un saurait comment afficher le nom des entreprises.

Voici le genre de réponse que j'ai de la part de l'api :

{
  "Items": [
    {
      "Id": "Un Id",
      "CompanyName": "Un nom d'entreprise",
      "ExternalCustomerId": "Un nom d'entreprise",
      "CustomerProviderData": [
        {
          "ProviderCustomerId": "Un id",
          "ProviderId": Un id,
          "ProviderData": {
            "TenantId": "Un id",
            "Domain": "Un nom de domaine",
            "IndirectResellerId": "",
            "CustomerQualification": "None",
            "OrganizationRegistrationNumber": null,
            "QualificationUnderVetting": null
          }
        }
      ]
    },{
      "Id": "Un Id",
      "CompanyName": "Un nom d'entreprise",
      "ExternalCustomerId": "Un nom d'entreprise",
      "CustomerProviderData": [
        {
          "ProviderCustomerId": "Un id",
          "ProviderId": Un id,
          "ProviderData": {
            "TenantId": "Un id",
            "Domain": "Un nom de domaine",
            "IndirectResellerId": "",
            "CustomerQualification": "None",
            "OrganizationRegistrationNumber": null,
            "QualificationUnderVetting": null
          }
        }
      ]
    },

Et voici le code que j'ai fait pour essayer d'afficher la liste des noms d'entreprise :
           

string responseString = response1.Content;

            string data = Regex.Replace(responseString, @"\\r\\n", "");
            string finaldata = Regex.Replace(data, @"\\""", "");

            JObject Clients = JObject.Parse(finaldata);

            JArray ListeClients = (JArray)Clients["Items"];

            IList<UneClasse> company = ListeClients.ToObject<IList<UneClasse>>();

            for (int i = 0; i < company.Count(); i++)
            {
                Console.WriteLine(company[i].CompanyName);
            }

Le code bloque à cette ligne : JObject Clients = JObject.Parse(finaldata);

Avec cette erreur : 'Error reading JObject from JsonReader. Current JsonReader item is not an object: String. Path ".

Je ne comprend pas pourquoi j'ai cette erreur, si quelqu'un pourrait me diriger (je suis encore nouveau dans la désérialisation même si je m'informe le plus possible et désolé pour ce pavé).

8 réponses

Bonjour

tu utilises cette api https://www.newtonsoft.com/json/help/html/R_Project_Documentation.htm ?

0
turtle123 Messages postés 5 Date d'inscription jeudi 16 février 2023 Statut Membre Dernière intervention 17 février 2023
16 févr. 2023 à 13:24

Non j'utilise une api privée, pour l'utiliser il faut des informations "secrètes" qui sont directement données par l'entreprise qui s'occupe de l'api.

0

je ne te parles pas de l'api qui te donne le fichier json, mais de celle avec laquelle tu essayes de le déserialiser.

Si, tout en haut de ton code tu as

using Newtonsoft.json.Linq;

alors, on parle bien de la même chose.

Dans la négative, il faudra préciser quel outil de déserialisation tu utilises.


Je pars du principe qu'on parle de la même chose.

D'abord ton fichier (ou texte c'est pareil) json est incorrect.

{
  "Items": [
    {
      "Id": "Un Id",
      "CompanyName": "Un nom d'entreprise",
      "ExternalCustomerId": "Un nom d'entreprise",
      "CustomerProviderData": [
        {
          "ProviderCustomerId": "Un id",
          "ProviderId": "12",
          "ProviderData": {
            "TenantId": "Un id",
            "Domain": "Un nom de domaine",
            "IndirectResellerId": "",
            "CustomerQualification": "None",
            "OrganizationRegistrationNumber": null,
            "QualificationUnderVetting": null
          }
        }
      ]
    },{
      "Id": "Un Id 2",
      "CompanyName": "Un nom d'entreprise 2",
      "ExternalCustomerId": "Un nom d'entreprise",
      "CustomerProviderData": [
        {
          "ProviderCustomerId": "Un id",
          "ProviderId": "13",
          "ProviderData": {
            "TenantId": "Un id",
            "Domain": "Un nom de domaine",
            "IndirectResellerId": "",
            "CustomerQualification": "None",
            "OrganizationRegistrationNumber": null,
            "QualificationUnderVetting": null
          }
        }
      ]
    }
	]
}
  • A la fin il manque des ] et de }, ça on va dire que c'est une erreur de copier/coller (je les ai rajouté au-dessus)
  • Aux lignes 12 et 28, il n'y a pas de "" autour de la données et ça c'est obligatoire en json. Si c'est une boulette de ta part au moment de faire un exemple anonyme, ok pas grave. Mais si ton fournisseur diffuse vraiment un fichier comme ça, tu as un problème car il ne correspond pas à la norme et les parser ne vont pas marcher. Il va falloir traiter le soucis. Pour l'instant, je pars du principe que c'est une boulette de ta part.

Ton code de déséralization maintenant.

  • tu supprimes les sauts de lignes => ça ne sert à rien
  • tu supprimes les "", or je l'ai dit plus haut, il faut qu'ils soient là => à ne pas faire
  • tu utilises la classe "UneClasse" (et 2 autres d'ailleurs") que tu n'as pas montrées (à nous de deviner....)

J'ai donc écrit mes propres classes, enlevés la suppression inutile et la suppression interdite et ça marche.

Donc soit la suppressions des "" est responsable de ton bug, soit t'as un soucis dans tes classes.

Les classes d'abord

			    class UneClasse
    {
        public string Id { get; set; }

        public string CompanyName { get; set; }

        public string ExternalCustomerId { get; set; }

        public IList<AutreClasse> CustomerProviderData { get; set; }

    }

    class AutreClasse
    {
        public string ProviderCustomerId { get; set; }

        public int ProviderId { get; set; }

        public DerniereClasse ProviderData { get; set; }
    }

    class DerniereClasse
    {
        public string TenantId { get; set; }

        public string Domain { get; set; }

        public string IndirectResellerId { get; set; }

        public string CustomerQualification { get; set; }

        public string OrganizationRegistrationNumber { get; set; }

        public string QualificationUnderVetting { get; set; }

    }

Le code de déserialization ensuite

            string finaldata = File.ReadAllText("json.txt");

            JObject Clients = JObject.Parse(finaldata);

            JArray ListeClients = (JArray)Clients["Items"];

            IList<UneClasse> company = ListeClients.ToObject<IList<UneClasse>>();

            for (int i = 0; i < company.Count(); i++)
            {
                Console.WriteLine(company[i].CompanyName);
            }

Commence par tester sans les suppressions et si ça ne suffit pas compare tes classes avec les miennes.

PS pour tes prochains message, merci de faire comme décrit là https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code

0
turtle123 Messages postés 5 Date d'inscription jeudi 16 février 2023 Statut Membre Dernière intervention 17 février 2023
16 févr. 2023 à 14:50

Ah désolé je n'avais pas vu qu'on pouvait directement implémenter du code.

Sinon par rapport à ta réponse, oui j'utilise Newtonsoft.json.Linq. Ensuite, tu me dis que je dois créer un fichier json.txt avec la réponse de mon api dedans ?

Je demande vu qu'à la base je n'ai pas de fichier de ce style (Je viens de le faire).

Mes classes étaient bonnes mais c'est vrai j'aurai dû les montrer, excuse moi.

Par contre quant aux lignes 12 et 28 (TenantId) c'est la réponse qui est comme ça. Il n'y a pas les guillemets à la base.

Pour le "[" et "}" manquants c'est moi qui ai fait l'erreur j'ai oublié de refermer "Items" et le texte json.

En faisant ce que tu m'as dis, ça ne marche pas mais j'imagine que c'est parce qu'il manque des guillemets aux différents "TenantId" ?

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
turtle123 Messages postés 5 Date d'inscription jeudi 16 février 2023 Statut Membre Dernière intervention 17 février 2023
16 févr. 2023 à 14:55

Pour x raisons je ne peux pas modifier mon message, je voulais dire aux différentes valeurs des "ProviderId" et non "TenantId"

0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656
16 févr. 2023 à 16:40

J'ai mis le texte dans un fichier par soucis de simplicité pour mon test.

Si tes classes sont bonnes, et que tu as retiré les suppressions de ton code, alors oui le problème vient probablement des guillemets de cet attribut.

Du coup mets une vraie réponse dans un fichier.

Ajoute les guillemets et lit le avec ton code.

Si ça marche, ça validera que le problème est là.

Ensuite, une regex pourrait qui chercherait des attributs sans guillemets pour les remettre peut être une solution.


0
turtle123 Messages postés 5 Date d'inscription jeudi 16 février 2023 Statut Membre Dernière intervention 17 février 2023
17 févr. 2023 à 08:33

Effectivement ça marche, il faut mtn que je rajoute avec regex les guillemets.

Merci pour ton aide, tu m'as bien aidé.

Bonne journée

0
Whismeril Messages postés 19020 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 15 avril 2024 656
17 févr. 2023 à 19:47

De rien, pense à marquer le sujet résolu 


0
Rejoignez-nous