[PYTHON] Lire json avec C # et convertir en type dictionnaire (forcé)

ça fait longtemps.

Cela fait longtemps, tout le monde à Qiita. Cela fait longtemps depuis la dernière fois, mais j'ai acheté un nouvel ordinateur depuis. Et j'en ai eu marre de Python, alors j'ai décidé d'essayer C #.

Écrivez-le sous forme de mémo pour comprendre. Veuillez pardonner les points perdus.

À propos du chargement de json que je pensais

J'avais l'habitude d'utiliser json en Python pour stocker des fichiers de configuration et des données qui devaient être définis dans json pour plus de commodité, donc je voulais absolument l'utiliser également en C #. J'étais un peu au courant, mais je me demandais quelle était une excellente bibliothèque Python.

code de chargement json

hoge.json


{
  "hoge": "hoge1",
  "hogehoge": "hoge2",
  "hogehogehoge": "hoge3"
}

Le chargement de json en Python utilise la bibliothèque json

import json

def load_json(filename):
    with open(filename) as files:
        load = json.load(files)

    return load

Si vous définissez une fonction comme celle-ci, elle reviendra en tant que type de dictionnaire.

result = load_json("hoge.json")

hoge1 = result["hoge"]
hoge2 = result["hogehoge"]
hoge3 = result["hogehogehoge"]

print(hoge1)
print(hoge2)
print(hoge3)

print(type(hoge1))
print(type(hoge2))
print(type(hoge3))

hoge1
hoge2
hoge3
<class 'str'>
<class 'str'>
<class 'str'>

Si vous faites cela, vous pouvez facilement revenir avec str ou int, vous pouvez donc facilement l'utiliser si vous le faites bouillir ou cuire au four. (Gabacode Degomen)

Pour C #

using System;
using System.IO;
using System.Text;
using System.Text.Json;

namespace ConsoleApp2
{
    class Program
    {
        public static string ReadAllLine(string filePath, string encodingName)
        {
            StreamReader sr = new StreamReader(filePath, Encoding.GetEncoding(encodingName));
            string allLine = sr.ReadToEnd();
            sr.Close();

            return allLine;
        }

        class hogejson
        {
            public string hoge { get; set; }
            public string hogehoge { get; set; }
            public string hogehogehoge { get; set; }
        }
        static void Main(string[] args)
        {
            string readjson = ReadAllLine("hoge.json", "utf-8");

            hogejson jsonData = JsonSerializer.Deserialize<hogejson>(readjson);

            string hoge = jsonData.hoge;
            string hogehoge = jsonData.hogehoge;
            string hogehogehoge = jsonData.hogehogehoge;

            Console.WriteLine(hoge);
            Console.WriteLine(hogehoge);
            Console.WriteLine(hogehogehoge);

            Console.WriteLine(hoge.GetType());
            Console.WriteLine(hogehoge.GetType());
            Console.WriteLine(hogehogehoge.GetType());

        }
    }
}
hoge1
hoge2
hoge3
System.String
System.String
System.String

Si vous ne l'écrivez pas comme ça, il ne se lira pas bien, mais le plus gênant personnellement est ** "Je dois créer une classe json" ** Noto ** "C'est difficile à comprendre quand je crée une méthode (une fonction en Python (bien que ce soit un peu différent))! Je me suis fait prendre.

Pourquoi est-ce arrivé

En Python, la valeur de retour retournée par la fonction précédente doit être ** type dictionnaire **, tandis qu'en C #, ** valeur de retour spécifique ** doit être spécifiée. Pour cette raison, en Python, il revient en tant que type de dictionnaire.

hoge = result["hoge"]

Vous pouvez récupérer la valeur "hoge1" de la clé "hoge" simplement en la spécifiant dans et result. D'autre part, C # est mis à hoge de la classe "hogejson" en tant que type de chaîne (str) lorsque la valeur de "hoge" qui est la clé de "hoge.json" est "hoge1". Au contraire, si vous essayez de définir ceci avec le type int ou un autre type, vous ne pouvez pas.

En effet, la valeur de retour de la classe hoge est déterminée comme étant une chaîne. Par conséquent, comme elle n'est pas spécifiée comme valeur de retour dans le type de dictionnaire qui était souvent pris en charge en Python, même si la valeur de retour est spécifiée comme un type de dictionnaire "arbitrairement", non seulement les clés des autres "hogehoge" et "hogehogehoge" mais aussi la valeur Je n'ai même pas les informations (auto-interprétation)

Faisons en sorte qu'il revienne au type dictionnaire! Lol

Quand je l'ai cherché, il semble qu'il y ait une "classe Dictionary" en C #, donc elle peut être utilisée de la même manière que le type de dictionnaire Python.

Ensuite, l'histoire est rapide, voici le résultat d'essais et d'erreurs répétés afin que la clé et la valeur de hoge.json puissent être regroupées dans un type de dictionnaire.

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.Json;

namespace ConsoleApp2
{
    class library
    {
        //Lecture de fichier
        public string ReadAllLine(string filePath, string encodingName)
        {
            StreamReader sr = new StreamReader(filePath, Encoding.GetEncoding(encodingName));
            string allLine = sr.ReadToEnd();
            sr.Close();

            return allLine;
        }

        //Convertir de force le type de liste en type de dictionnaire
        public static Dictionary<string, string> ListInDictionary(string[] left, string[] right)
        {
            
            //Quand ils correspondent
            if (left.Length == right.Length)
            {

                var result = new Dictionary<string, string>();

                //Tournez pour le nombre de listes sur la gauche
                for (int i = 0; i < left.Length; i++)
                {
                    
                    //Ajouter un dictionnaire au résultat
                    result.Add(left[i], right[i]);
                }

                return result;

            }
            
            //Quand il y a un écart
            else
            {
                return null;
            }
        }

        class hogejson
        {
            public string hoge { get; set; }
            public string hogehoge { get; set; }
            public string hogehogehoge { get; set; }
        }
        //hoge.Méthode pour charger json
        public Dictionary<string, string> GetHogejson(string filename)
        {
            try
            {
                string jsonfile = ReadAllLine(filename, "utf-8");

                hogejson jsonData = JsonSerializer.Deserialize<hogejson>(jsonfile);

                string[] json_key = { "hoge", "hogehoge", "hogehogehoge" };
                string[] json_value = { jsonData.hoge, jsonData.hogehoge, jsonData.hogehogehoge };

                var result = ListInDictionary(json_key, json_value);

                return result;
            }

            //Lorsque json ne peut pas être lu
            catch (JsonException)
            {
                return null;
            }

        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            library Library = new library();

            Dictionary<string, string> gethogejson = Library.GetHogejson("hoge.json");

            string hoge, hogehoge, hogehogehoge;

            hoge = gethogejson["hoge"];
            hogehoge = gethogejson["hogehoge"];
            hogehogehoge = gethogejson["hogehogehoge"];

            Console.WriteLine(hoge);
            Console.WriteLine(hogehoge);
            Console.WriteLine(hogehogehoge);

            Console.WriteLine(hoge.GetType());
            Console.WriteLine(hogehoge.GetType());
            Console.WriteLine(hogehogehoge.GetType());

        }
    }
}

... je l'ai senti trop agressivement ...

problème

  1. ** Que la valeur soit de type int ou non, définissez-la de type chaîne et stockez-la dans result (type de dictionnaire). ** **
  2. Après tout, nous devons spécifier la classe des données json, nous n'avons donc pas atteint une solution fondamentale.
  3. Pour le moment, je l'ai fait avec force avec l'idée et la sagesse que j'avais imaginées, alors je me suis mis en colère quand je l'ai vu.

Personnellement, je suis très reconnaissant qu'il puisse être utilisé comme Python, mais j'ai l'impression qu'il est trop agressif et en colère.

Au fait, le résultat est

hoge1
hoge2
hoge3
System.String
System.String
System.String

Il sera affiché comme ceci.

finalement

N'hésitez pas à commenter s'il y a quelque chose comme "C'est mieux que cette méthode ~~~ Trop de gabber ~~"! J'avais de sérieux ennuis, alors j'essaierai de l'améliorer si j'ai le temps.

Postscript Qu'est-ce que c'est? Il sort souvent et reste bloqué. Dans ce cas, il n'y a pas d'autre choix que de le sauvegarder et de le redémarrer, ce qui est très gênant. Screenshot_11.png

Je l'ai écrit après un long moment. bonne nuit.

Source du devis

https://usefuledge.com/csharp-json.html https://json2csharp.com/ (Le site qui crée la classe de données json plus tôt sur la base des données json est très pratique) Thank you!!!!!

Recommended Posts

Lire json avec C # et convertir en type dictionnaire (forcé)
Lisez le binaire big endian en Python et convertissez-le en ndarray
Lire et écrire des fichiers JSON avec Python
Comment générer une séquence en Python et C ++
Convertir des fichiers CSV UTF-8 pour les lire dans Excel
Comment lire JSON
Convertir json en Excel
Convertir la date et l'heure zonées en temps Unixtime dans Python2.7
Convertir / renvoyer des objets de classe au format JSON en Python
Convertir le type d'entité Webpay en type Dict (récursivement en Python)
Aller à la langue pour voir et se souvenir du langage Partie 7 C en langage GO
C / Python> Lire la valeur fwrite () en C avec Python> v0.1: 1 valeur / v0.2: 3 valeurs / v0.3: correspond à size_t / v0.4: lire le type complexe double
Conseils pour coder courts et faciles à lire en Python
Comment créer et utiliser des bibliothèques statiques / dynamiques en langage C
J'ai essayé d'illustrer le temps et le temps du langage C
Comment obtenir toutes les clés et valeurs du dictionnaire
Je veux rendre le type de dictionnaire dans la liste unique
Orienté objet en langage C: "○ ✕ game" a été refacturé et porté en Python
Déterminez le format de la date et de l'heure avec Python et convertissez-le en Unixtime
Convertir l'objet Statut Tweepy en JSON
Convertir Markdown en PDF en Python
Comment convertir 0,5 en 1056964608 en un seul coup
Conserver et lire l'ordre dans PyYAML
Comment envelopper C en Python
Journalisation Python et vidage vers json
Ignorer # ligne et lire avec les pandas
Créer et lire des paquets de messages en Python
Jouez pour prédire la valeur de la course et le type à partir du nom de Pokemon dans TensorFlow
Lisez le fichier CSV avec Python et convertissez-le en DataFrame tel quel
Convertir Python> séquence de deux valeurs en dictionnaire
Comment convertir csv en tsv dans la CLI
Implémenter le filtre FIR en langage Python et C
Lier à la classe pour lire et écrire YAML
Convertir (compresser) une chaîne de caractères JSON formatée en JSON 1 ligne
Convertir un fichier psd en png en Python
Convertir des données Excel en JSON avec python
Lire Python csv et exporter vers txt
[Introduction à l'application Udemy Python3 +] 24. Type de dictionnaire
Convertir un tableau (struct) en json avec golang
Convertir de Markdown en HTML en Python
Comment lire des fichiers CSV avec Pandas
Comment utiliser is et == en Python
Convertir une URL absolue en URL relative en Python
Livres sur la science des données à lire en 2020
Résolution avec Ruby, Perl, Java et Python AtCoder ARC 086 C Hash Sorting
Je suis accro à la différence dans la façon dont Flask et Django reçoivent les données JSON
Comment lire les fichiers de numéros de série en boucle, les traiter et les représenter graphiquement
Différences dans la façon d'écrire du code source externe entre Ruby et Python
Tapez des notes sur les scripts Python pour exécuter le modèle PyTorch en C ++ avec libtorch