web-dev-qa-db-fra.com

Chargement d'un fichier .json dans le programme c #

Je suis nouveau dans les objets c # et json et j'essaie de déplacer mon site Web de fichiers de configuration basés sur xml vers des fichiers basés sur json. Est-il possible de charger un fichier .json pour qu'il se transforme en objet? J'ai cherché sur le Web et je ne peux pas en trouver un. Le fichier XML est déjà converti et enregistré au format .json. Je préférerais ne pas utiliser une bibliothèque tierce.

27
ford prefect

Vous vraiment devez utiliser une bibliothèque établie, telle que Newtonsoft.Json (qui même Microsoft utilise des frameworks tels que MVC et WebAPI), ou le composant intégré de .NET JavascriptSerializer .

Voici un exemple de lecture de JSON à l'aide de Newtonsoft.Json:

JObject o1 = JObject.Parse(File.ReadAllText(@"c:\videogames.json"));

// read JSON directly from a file
using (StreamReader file = File.OpenText(@"c:\videogames.json"))
using (JsonTextReader reader = new JsonTextReader(file))
{
  JObject o2 = (JObject) JToken.ReadFrom(reader);
}
58
STW

Un autre bon moyen de sérialiser JSON en C # est le suivant:

RootObject ro = new RootObject();
     try
    {

        StreamReader sr = new StreamReader(FileLoc);
        string jsonString = sr.ReadToEnd();
        JavaScriptSerializer ser = new JavaScriptSerializer();
        ro = ser.Deserialize<RootObject>(jsonString);


   }

vous devez ajouter une référence à system.web.extensions dans .net 4.0 dans les fichiers de programme (x86)> assemblys de référence> framework> system.web.extensions.dll et vous devez être sûr que vous utilisez la version 4.0 normale framework pas client 4.0

9
ford prefect

Comme mentionné dans l'autre réponse, je recommanderais d'utiliser json.NET. Vous pouvez télécharger le package en utilisant NuGet. Ensuite, pour désérialiser vos fichiers JSON en objets C #, vous pouvez faire quelque chose comme:

   JsonSerializer serializer = new JsonSerializer();
   MyObject obj = serializer.Deserialize<MyObject>(File.ReadAllText(@".\path\to\json\config\file.json");

Le code ci-dessus suppose que vous avez quelque chose comme

public class MyObject
{
    public string prop1 { get; set; };
    public string prop2 { get; set; };
}

Et votre json ressemble à;

{
      "prop1":"value1",
      "prop2":"value2"
}

Je préfère utiliser la méthode générique de désérialisation qui permet de désérialiser json en un objet en supposant que vous lui fournissiez un type dont la définition correspond à celle de json. S'il y a des divergences entre les deux, cela peut générer ou ne pas définir de valeurs, ou tout simplement ignorer des éléments du json, dépend de la nature du problème. Si la définition de json correspond exactement à la définition des types C #, alors cela fonctionne.

6
evanmcdonnal

Utilisez Server.MapPath pour obtenir le chemin d'accès réel du fichier JSON, puis chargez-le et lisez-le à l'aide de StreamReader.

using System;
using System.Collections.Generic;
using Newtonsoft.Json;

public class RootObject
{
    public string url_short { get; set; }
    public string url_long { get; set; }
    public int type { get; set; }
}

public class Program
{
    static public void Main()
    {
       using (StreamReader r = new StreamReader(Server.MapPath("~/test.json")))
       {
           string json = r.ReadToEnd();
           List<RootObject> ro = JsonConvert.DeserializeObject<List<RootObject>>(json);
       }

    Console.WriteLine(ro[0].url_short);                 
    }  
}

Remarque: Regardez le lien ci-dessous aussi, j'ai répondu à une question semblable à celle-ci.Il sera l'aide complète pour vous Comment analyser un exemple de chaîne en C #

2
Shakir Ahamed

Voir Microsofts JavaScriptSerializer

La classe JavaScriptSerializer est utilisée en interne par la couche de communication asynchrone pour sérialiser et désérialiser les données transmises entre le navigateur et le serveur Web. Vous ne pouvez pas accéder à cette instance du sérialiseur. Cependant, cette classe expose une API publique. Par conséquent, vous pouvez utiliser la classe lorsque vous souhaitez utiliser JSON (JavaScript Object Notation) dans du code managé.

Espace de noms : System.Web.Script.Serialization

Assembly : System.Web.Extensions (dans System.Web.Extensions.dll)

1
Seth Flowers