0
votes

JSON avec réponse de tableau de l'API

J'ai un client HTTP et j'envoie une requête à un serveur. La réponse du serveur est un JSON. Dans ce Json est également un tableau. Je veux afficher les informations du JSON dans la console. J'obtiens toutes les informations du JSON, mais je n'ai pas le tableau affiché dans ma console.

Le JSON ressemble à ceci:

if (Response().IsSuccessStatusCode)
        {
            var namesJ= Response().Content.ReadAsAsync<IEnumerable<Names>>().Result;
            var preNamesJ= await Response().Content.ReadAsAsync<List<PreNames>>();



            foreach (var a in namesJ)

            {

                Console.WriteLine("Name1: {0}", a.Name1);

                foreach(var b in preNamesJ)
                {
                    Console.WriteLine("{0}", b.PreName);
                }
                
            }

Alors maintenant, mon code pour l'instant:

public class PreNames //for Array
    {
        public string PreName { get; set; }
        public string PreName2{ get; set; }
    }

    public class Names//for JSON
    {
        public string Name1{ get; set; }
        public string Name2{ get; set; }
        public string Name3{ get; set; }
    }

Et mon principal:

{
    "Name1": "Karl",
    "Name2": "Peter",
    "Name3": "Wilhelm",
    "PreNames": {
        "PreName": "Werner",
        "PreName2": "Josef"
    }
}

Donc, dans la console sont tous les noms affichés, mais pas les prénoms donc je ne peux pas obtenir les prénoms du tableau dans le JSON ...

J'espère que quelqu'un pourra m'aider :)


6 commentaires

ajouter le JSON approprié celui-ci ne semble pas valide


comment je fais ça ? : /


Je suis votre asynchrone principal? Sinon, vous voudrez peut-être supprimer le mot-clé await et ajouter un .Result () à la fin de la ligne. Si tel est le cas, vous devez supprimer le .Result () et ajouter un mot-clé d'attente à droite du "="


la méthode pour le JSON est normale, mais la méthode pour le tableau est Async. aussi pas travaillé


le commentaire sur l'async, .Result () semble correct le json, si c'est exactement ce que vous récupérez n'est pas valide, il devrait être quelque chose comme: {"Name1": "Karl", "Name2": "Peter", "Name3": "Wilhelm", "PreNames": [{"PreName": "Werner"}, {"PreName2": "Josef"}]} Vous ne pouvez pas avoir de tableau d'objets json sans mettre les paires clé / valeur dans { ...}


oui, mais c'est un JSON valide .. C'est la réponse du serveur. Le JSON dans ma question a été écrit à la main et était un exemple. Mon JSON d'origine est valide, mais la syntaxe est égale à mon exemple


4 Réponses :


0
votes

Je n'ai pas la réputation suffisante pour commenter, alors ... je vais essayer.

Modifié après la mise à jour correcte de json dans Answer.

  1. Changez les noms de vos cours
Console.WriteLine($"Name 1: {names.Name1}");
Console.WriteLine($"Prename 1: {names.PreNames.PreName}");
  1. Désérialisez-le ensuite avec JsonConvert
var json = await Response().Content.ReadAsStringAsync();
var names = JsonConvert.DeserializeObject<Names>(json);
  1. Accédez ensuite aux données
public class Names
{
    public string Name1 { get; set; }
    public string Name2 { get; set; }
    public string Name3 { get; set; }
    public PreNames PreNames { get; set; }
}


4 commentaires

le "name.SurNames? .reName" ne fonctionne pas ... après PreName?, je ne peux pas choisir le PreName


Si vous passez la souris sur le nom de (var nom dans les noms) en mode débogage, vous devriez voir Name1, Name2, Name3 et PreNames. J'ai ajouté le? juste au cas où la valeur (PreNames) est nulle, ce qui semble être le cas. Pourriez-vous s'il vous plaît clarifier quelle est exactement cette partie du JSON original que vous recevez?


quand je passe la souris, je peux voir que dans "json" est la réponse entière, mais "nom" est nul. et le ? est également ajouté


Je viens de voir que vous avez édité le premier json, alors le voici (je vais aussi mettre à jour ma réponse): dotnetfiddle.net/9EG8WK



0
votes

Si votre Json ressemble à:

foreach (var b in a.Prenames) {
    Console.WriteLine(b.PreName);
}

Si les prénoms sont dans les noms, vous devez ajouter un champ Prénoms dans le Noms Classe.

public class Names
{
    public string Name1 { get; set; }
    public string Name2 { get; set; }
    public string Name3 { get; set; }
    public PreNames PreNames { get; set; }
}

Ensuite, vous pouvez lire les prénoms internes:

{
    "Name1": "Karl",
    "Name2": "Peter",
    "Name3": "Wilhelm",
    "PreNames": {
        "PreName": "Werner",
        "PreName2": "Josef"
    }
}

Mais je ne suis pas sûr si je comprends votre question.


0 commentaires

1
votes

Ajoutez la propriété PreNames à votre classe Names et ne lisez qu'une seule fois.

public class Names//for JSON
    {
        public string Name1{ get; set; }
        public string Name2{ get; set; }
        public string Name3{ get; set; }
        public PreNames PreNames { get; set;}
    }

var namesJ= Response().Content.ReadAsAsync<Names>().Result;
Console.WriteLine(namesJ.PreNames.Name);

Une fois que vous avez lu le résultat une fois, vous pouvez accéder aux éléments via l'objet principal

var namesJ= Response().Content.ReadAsAsync<Names>().Result;
foreach(var names in namesJ.PreNames)
{
  Console.WriteLine(names.PreName);
}

mis à jour Puisque vous avez changé le json et fait de PreNames juste un objet au lieu d'un tableau, accédez simplement à la propriété de l'objet associé.

public class Names//for JSON
    {
        public string Name1{ get; set; }
        public string Name2{ get; set; }
        public string Name3{ get; set; }
        public List<PreNames> PreNames { get; set;}
    }


0 commentaires

0
votes

@ Leonc443, Voici un code fonctionnel

    using Newtonsoft.Json;  //add this nuget package
    using System;

    namespace ConsoleApp
    {
        class Program
        {
            public static void Main(string[] args)
            {
                string json = @"{
                    'Name1': 'Karl',
                    'Name2': 'Peter',
                    'Name3': 'Wilhelm',
                    'PreNames': {
                                'PreName': 'Werner',
                                'PreName2': 'Josef'
                            }
                }";  // data received from api
                var names = JsonConvert.DeserializeObject<Names>(json);
                Console.WriteLine(names.Name1);     // Karl
                Console.WriteLine(names.Name2);     //Peter
                Console.WriteLine(names.Name3);     //Wilhelm
                Console.WriteLine(names.PreNames.PreName);      //Werner
                Console.WriteLine(names.PreNames.PreName2);     // Josef

            }
        }
        public class Names
        {
            public string Name1 { get; set; }
            public string Name2 { get; set; }
            public string Name3 { get; set; }
            public PreNames PreNames { get; set; }
        }

        public class PreNames
        {
            public string PreName { get; set; }
            public string PreName2 { get; set; }
        }
    }

S'il vous plaît laissez-moi savoir si cela aide


0 commentaires