0
votes

Impossible de trouver un constructeur

ScreenShot Of Error J'ai un fichier json qui contient des données et je veux pour l'analyser mais chaque fois que je veux désérialiser un objet, cela me donne cette erreur "Impossible de trouver un constructeur. Une classe doit avoir un constructeur par défaut, un constructeur avec des arguments ou un constructeur marqué avec le constructeur json je ne sais pas quoi faire parce que je n'ai pas travaillé avec json avant que ce soit la première fois que je travaille avec json. voici mon json:

private void ReadJson()
    {
        var assembly = typeof(WordProblemsScreen).GetTypeInfo().Assembly;
        Stream stream = 
assembly.GetManifestResourceStream("MathRandomizer.demo.json");

        using (var reader = new System.IO.StreamReader(stream))
        {

            string json = reader.ReadToEnd();

            JObject jObject = JObject.Parse(json);
            JToken jUser = jObject["Addition"];


            var addition = JsonConvert.DeserializeObject<Addition>(json);




        }
    }

voici ma classe de modèle

public class Addition
{

     public List<string> Easy { get; set; }
        public List<string> Medium { get; set; }
        public List<string> Difficult { get; set; }

    public Addition() { }

}

voici ma fonction dans laquelle je suis un objet Désérialisé

{
   "Addition":
   {
       "Easy": [

                "New York Bulls",
                "Los Angeles Kings",
                "Golden State Warriros",
                "Huston Rocket"
            ],
      "Medium":[
                "New York Bulls",
                "Los Angeles Kings",
                "Golden State Warriros",
                "Huston Rocket"
      ],
       "Difficult": [
               "New York Bulls",
               "Los Angeles Kings",
               "Golden State Warriros",
               "Huston Rocket"
      ] 
   }
}


18 commentaires

Je pense que vous n'avez même pas besoin de ce constructeur et que vous pouvez vous fier au constructeur par défaut à la place. JsonConvert l'utilisera si aucun autre n'est fourni et définira les propriétés de manière appropriée.


@HimBromBeere j'ai essayé ce que vous dites mais l'erreur était toujours la même


@HimBromBeere toujours la même erreur


Je pense que vous avez une autre classe Addition . Cliquez au milieu de puis appuyez sur [F12] . Voyez où cela vous mène.


var addition = JsonConvert.DeserializeObject (json); <- vous essayez de désérialiser votre JSON dans le mauvais objet. Vous avez besoin d'un objet racine.


@HenkHolterman non j'utilise la bonne classe, cela m'amène à la classe que j'ai définie dans la question ci-dessus


@John pouvez-vous expliquer un peu plus ou écrire un code valide


Votre classe ne correspond pas au json :-)


@Masti Vos classes C # doivent correspondre à vos objets JSON. Le premier { de votre JSON est l'objet dans lequel vous devez désérialiser. L'objet racine de votre JSON contient votre classe Additions - vous semblez en être conscient depuis la ligne JToken jUser = jObject ["Addition"]; .


Publiez toujours le ou les messages d'erreur exacts, avec les numéros de ligne et la trace de pile si possible.


Double possible de Désérialiser JSON en classes C #


J'ai annulé votre modification, car elle invalide les réponses déjà fournies.


mais la réponse ne fonctionne pas pour moi mec


toujours la même erreur


Cela fonctionne pour moi une fois que j'ajuste votre appel de désérialisation pour refléter que RootObject est imbriqué dans Ajout (pour une raison quelconque?). Comme je l'ai déjà dit: la seule conclusion logique maintenant est que votre JSON est différent. Sans savoir ce qu'est vraiment votre JSON, nous n'avons aucun moyen de vous aider. J'ai imprimé le JSON dans le violon lié - le manque de nouvelles lignes ne fait aucune différence. Comparez-le à votre JSON réel en utilisant également Console.WriteLine (json) dans votre propre code.


Je ne crois pas non plus que vous obtenez le même "Impossible de trouver un constructeur". Erreur.


je reçois toujours cette erreur, pouvons-nous faire un chat privé pour que je puisse vous montrer que je reçois toujours cette erreur


Nettoyez et reconstruisez votre projet.


3 Réponses :


2
votes

Collez votre Json en C # en utilisant Édition - Collage spécial - Collez JSON en C # ou utilisez l'un des convertisseurs JSON en C # en ligne et vous verrez le problème:

public class Addition
{
    public List<string> Easy { get; set; }
    public List<string> Medium { get; set; }
    public List<string> Difficult { get; set; }
}

public class RootObject
{ 
   public Addition Addition { get; set; }
}


1 commentaires

@Masti Deserialize en RootObject.



0
votes

Vous avez besoin d'un objet racine:

public class RootObject
{
    public Person Person { get; set; }
}

public class Person
{
    public string Name { get; set; }
}

Essayez-le en ligne

Et même fonctionne avec votre ancien code avec le [JsonConstructor] code> attribut.

En termes simples: vos classes C # doivent correspondre au JSON que vous espérez désérialiser.

Imaginez que vous ayez le JSON suivant:

{
    "name": "John"
}


20 commentaires

j'obtiens la même erreur c'est ce que j'ai fait j'ai créé un nouveau nom de classe RootObject et mis le code ci-dessus dans cette classe puis je mets la dernière ligne dans ma fonction readjson mais toujours la même erreur


OK, comment se fait-il que nous n'obtenions pas l'erreur dans les deux exemples de violons? Vous faites quelque chose différemment.


J'ai un fichier json séparé à partir duquel je veux lire les valeurs mais vous écrivez json en classe


J'ai copié et collé le même code mais toujours la même erreur


@Masti, veuillez télécharger un exemple qui reproduit le problème sur GitHub et je vais y jeter un coup d'œil.


hey john j'ai testé votre code dans un nouveau projet séparé et son fonctionnement, mais lorsque j'utilise votre code dans mon projet existant, cela me donne la même erreur même si je crée une nouvelle page de contenu mais toujours le même problème dans mon projet existant


@Masti Vérifiez la version de JSON.NET que vous utilisez. Parfois, il existe des différences mineures entre les versions. Il est préférable d'utiliser la dernière version, je pense. Vérifiez également que vous n'avez pas deux classes (différentes de deux fichiers) avec le même nom, mais dans des espaces de noms différents. Il se peut que vous désérialisiez vers la mauvaise classe.


la version est 12.0.1 et je n'ai qu'une seule classe


@Masti Aucune idée alors j'ai peur. Il y a quelque chose d'étrange dans votre projet.


Je me sens aussi étrange parce que le même code fonctionne à 100% sur un projet séparé mais pas dans mon projet même maintenant, je n'ai pas de classes en double, etc.


Vérifiez cela en cliquant sur «Ajout» dans votre code de désérialisation puis appuyez sur F12 sur votre clavier. Cela vous mènera à la définition. Est-ce la classe que vous vous attendez à voir?


vérifier à nouveau ma question j'ai ajouté une capture d'écran de l'erreur


C'est très étrange . Je n'ai jamais eu à déclarer explicitement un constructeur. Essayez d'ajouter public RootObject () {} comme constructeur sans paramètre par défaut. Ce n'est pas exactement une solution si cela fonctionne, car JSON.NET ne devrait pas avoir besoin que vous le déclariez explicitement.


même problème bro btw ce code s'exécute sur un projet séparé


Pouvez-vous essayer de rétrograder JSON.NET une version majeure, juste au cas où il s'agirait d'un bogue.


mais bro alors pourquoi il fonctionne bien sur un projet séparé comme les versions sont les mêmes sur les deux projets 12.0.1


Bon point. Je n'ai honnêtement aucune idée à ce stade. Sans voir tout le projet défaillant et sans pouvoir le tester, je ne peux pas vraiment le conseiller.


Lié?


j'ai rétrogradé mais même problème


merci mec, je le résous en accédant aux options Android et en modifiant la liaison aux assemblages sdk uniquement



0
votes

L'exception se produit parce que vous essayez de convertir votre contenu JSON dans le mauvais objet. Comme votre JSON contient un attribut "Addition" en haut, il est considéré comme une propriété d'une classe parente. Donc, il attend une classe comme celle-ci:

{
    "Easy":
    [
        "New York Bulls",
        "Los Angeles Kings",
        "Golden State Warriros",
        "Huston Rocket"
    ],
    "Medium":
    [
        "New York Bulls",
        "Los Angeles Kings",
        "Golden State Warriros",
        "Huston Rocket"
    ],
    "Difficult":
    [
        "New York Bulls",
        "Los Angeles Kings",
        "Golden State Warriros",
        "Huston Rocket"
    ]
}

Si vous essayez dans l'autre sens en sérialisant un objet de type "Addition" et regardez la chaîne json sortante, vous verrez la différence:

var filledObject = new Addition()
{
    Easy = new List<string>()
    {
        "New York Bulls",
        "Los Angeles Kings",
        "Golden State Warriros",
        "Huston Rocket"
    },
    Medium = new List<string>()
    {
        "New York Bulls",
        "Los Angeles Kings",
        "Golden State Warriros",
        "Huston Rocket"
    },
    Difficult = new List<string>()
    {
        "New York Bulls",
        "Los Angeles Kings",
        "Golden State Warriros",
        "Huston Rocket"
    }
};

var serializedObject = JsonConvert.SerializeObject(filledObject);

Le résultat sera:

namespace JsonStuff
{
    public class SomeParentClass
    {
        public Addition AdditionObject { get; set; }

        public SomeParentClass()
        {

        }
    }
}

et là vous voyez la différence: Il n'y a pas de propriété "Addition" sur top.


1 commentaires

Vous pouvez soit créer une classe parent comme celle que j'ai postée en haut ou vous changer votre fichier json au format comme l'exemple en bas.