-3
votes

Désérialisations de fichiers JSON en C #

Je continue à obtenir l'erreur suivante:

Référence d'objet non définie sur une instance d'objet p> blockQuote>

Ceci est ma chaîne JSON dans un fichier sur C: \ part_param.json p> xxx pré>

et le code que j'utilise est comme suit: P >

    public class PLMpartParameter
    {
        public class Parameters
        {
            public float bar_diameter;
            public float core_height;
            public float roughing_offset;

            public Parameters(float barD, float coreH, float roughingO)
            {
                bar_diameter = barD;
                core_height = coreH;
                roughing_offset = roughingO;
            }
        }
        public Parameters parameters;

        public PLMpartParameter(Parameters param)
        {
            parameters = param;
        }

    }


    public static void LoadJson()
    {
        using (System.IO.StreamReader r = new System.IO.StreamReader(@"C:\part_param.json"))
        {
            string json = r.ReadToEnd();
            _logger.Info(string.Format("Read entire file complete. File Values: {0}", json));

            try
            {
                PLMpartParameter part = Newtonsoft.Json.JsonConvert.DeserializeObject<PLMpartParameter>(json);

            }
            catch (Exception e)
            {
                _logger.Info(string.Format("Read Json failed {0}", e.Message));
            }
        }


11 commentaires

La ligne qui lance l'exception peut être? Êtes-vous sûr que _logger est défini?


Quelle ligne jette l'erreur?


Duplicail possible de Qu'est-ce qu'une nullreferenceExceptionException et comment puis-je Fixez-le?


Vous avez un champ appelé paramètres , mais votre JSON a une propriété appelée part_parameters . (Je vous exhorte personnellement à faire les paramètres Classe de niveau supérieur et utilisez des propriétés au lieu des champs publics, avec [JSONProperty] pour spécifier le nom du fichier JSON Vous pouvez donc conserver le code conformément aux conventions de nommage .NET.)


Comme @jonskeet est ici, j'ai supprimé ma réponse. ;)


Cette ligne jette une erreur plmpartparameter partie = newtonsoft.json.jsonconvert.json.jsonconvert.deserializeObject (JSON);


De plus, une fois que vous résolvez cela, le JSON ne désercera pas, car la structure JSON ne correspond pas à la structure de la classe. Je pense en particulier de "Paramètres" dans les "paramètres Public Paramètres" dans le C # - Les noms de propriété doivent correspondre. Je ne sais pas non plus ce que Newtonsoft fera avec une classe qui n'a pas de constructeur sans paramètre.


@Prasadtelkikar Je pense que votre réponse est utile, bien que j'ai utilisé Coller Special Json comme des classes pour obtenir le même code. Bien que, il s'agit de Paramètres et probablement des champs vs propriétés qui sont les problèmes qui doivent être identifiés.


Ok jon. Je renommerai les propriétés. Est-ce que cela aiderait avec l'erreur cependant?


@sanchit: Exemple de code Link

4 Réponses :


2
votes

Je pense que le problème est que votre propriété s'appelle "Paramètres" mais dans votre JSON c'est "Paramètres".


0 commentaires

0
votes

Vous avez quelques problèmes avec votre code:

  1. Vous devez avoir des constructeurs par défaut pour les classes (cela est dû à la manière dont les sérialisateurs fonctionnent avec des types - ils ne comprennent pas votre constructeur paramétré spécifique à la classe).
  2. Vos champs doivent être des propriétés réglantes (il suffit d'ajouter {get; set;} et vous devriez être prêt à partir).
  3. Je vous suggère de décorer les paramètres avec [JSONProperty ("Paramètres")] Pour obtenir la désérialisation comportement que vous attendez.

1 commentaires

Je vois. J'ai essayé le get; set;, mais cela ne semblait pas faire quoi que ce soit. Mais comme vous l'avez mentionné dans la 3ème suggestion de décorer avec [JSONProperty ("Paramètres")], qui a fait l'affaire



1
votes

Citant la réponse de Prasad Telkikar comme cela corrigé cela immédiatement

Utilisez JSON2CSHARP pour obtenir un modèle pour votre fichier JSON, puis désérialisez votre JSON. Vous pouvez utiliser Visual Studio dans la fonction de construction pour créer la classe I.E. EDIT -> Coller Special -> Coller Json comme classe

voici la classe xxx

désérialiser, utilisez le code ci-dessous

plmpartparameter partie = Newtonsoft.json.jsonconvert.deserializeObject (JSON);

Mon code final ressemble à ceci, et son fonctionnement !! xxx


3 commentaires

Vous avez également besoin [JSONProperty ("Paramètres")]


Oui! Je suis nouveau à Json, je ne savais donc pas que j'ai besoin de formater mes propriétés comme celle-ci


Cela dit "ce que j'appellerai partharamètres est nommé dans le JSON en tant que Paramètres". Vous pouvez ajouter la même chose pour bar_diamètre, etc., pour retenir la nommage C #.



1
votes

Vous devez ajouter un attribut JSON au-dessus de votre propriété, de sorte que vos propriétés soient reconnues lors de la désériorialisation de votre objet.

Vous trouverez un exemple juste en dessous de p>

public class Parameters
{
    [JsonProperty("bar_diameter")]
    public float bar_diameter;
    [JsonProperty("core_height")]
    public float core_height;
    [JsonProperty("roughing_offset")]
    public float roughing_offset;

    public Parameters(float barD, float coreH, float roughingO)
    {
        bar_diameter = barD;
        core_height = coreH;
        roughing_offset = roughingO;
    }
}


0 commentaires