web-dev-qa-db-fra.com

Convertir une chaîne JSON en objet C #

Essayer de convertir une chaîne JSON en un objet en C #. En utilisant un cas de test très simple:

JavaScriptSerializer json_serializer = new JavaScriptSerializer();
object routes_list = json_serializer.DeserializeObject("{ \"test\":\"some data\" }");

Le problème est que routes_list n'est jamais défini; c'est un objet non défini. Des idées?

169
Justin

On dirait que vous essayez de désérialiser un objet brut. Vous pouvez créer une classe qui représente l'objet que vous convertissez. Cela serait très utile dans les cas où vous avez affaire à des objets plus volumineux ou à des chaînes JSON.

Par exemple:

  class Test {

      String test; 

      String getTest() { return test; }
      void setTest(String test) { this.test = test; }

  }

Votre code de désérialisation serait alors:

   JavaScriptSerializer json_serializer = new JavaScriptSerializer();
   Test routes_list = 
          (Test)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");

Plus d'informations peuvent être trouvées dans ce tutoriel: http://www.codeproject.com/Tips/79435/Deserialize-JSON-with-Csharp.aspx

122
jmort253

Ou, vous pouvez utiliser la bibliothèque Newtonsoft.Json comme suit:

using Newtonsoft.Json;
...
var result = JsonConvert.DeserializeObject<T>(json);

T est votre type d'objet correspondant à votre chaîne JSON.

187
tripletdad99

Vous ne voulez probablement pas simplement déclarer routes_list comme un type object. Il n'a pas de propriété .test, vous n'allez donc vraiment pas récupérer un objet Nice. C’est l’un des endroits où vous feriez mieux de définir une classe ou une structure, ou d’utiliser le mot-clé dynamic.

Si vous voulez vraiment que ce code fonctionne comme vous l'avez, vous devez savoir que l'objet renvoyé par DeserializeObject est un dictionnaire générique de chaîne, objet. Voici le code pour le faire de cette façon:

var json_serializer = new JavaScriptSerializer();
var routes_list = (IDictionary<string, object>)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Console.WriteLine(routes_list["test"]);

Si vous voulez utiliser le mot-clé dynamic, vous pouvez lire comment ici .

Si vous déclarez une classe ou une structure, vous pouvez appeler Deserialize au lieu de DeserializeObject comme suit:

class MyProgram {
    struct MyObj {
        public string test { get; set; }
    }

    static void Main(string[] args) {
        var json_serializer = new JavaScriptSerializer();
        MyObj routes_list = json_serializer.Deserialize<MyObj>("{ \"test\":\"some data\" }");
        Console.WriteLine(routes_list.test);

        Console.WriteLine("Done...");
        Console.ReadKey(true);
    }
}
55
mattmc3

Utilisation d'objet dynamique avec JavaScriptSerializer.

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
dynamic item = serializer.Deserialize<object>("{ \"test\":\"some data\" }");
string test= item["test"];

//test Result = "some data"
29

Newtonsoft est plus rapide que le sérialiseur de scripts Java. ... celui-ci dépend du paquet Newtonsoft NuGet, qui est populaire et meilleur que le sérialiseur par défaut.

solution de code à une ligne.

var myclass = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(Jsonstring);

Myclass oMyclass = Newtonsoft.Json.JsonConvert.DeserializeObject<Myclass>(Jsonstring);
18
MSTdev

Voici une classe simple que j'ai bricolée à partir de divers messages ... Il a été testé pendant environ 15 minutes, mais semble fonctionner pour mes besoins. Il utilise JavascriptSerializer pour effectuer le travail, qui peut être référencé dans votre application à l'aide des informations détaillées dans cet article .

Le code ci-dessous peut être exécuté dans LinqPad pour le tester:

  • Faites un clic droit sur l'onglet de script dans LinqPad et choisissez "Propriétés de la requête"
  • Référencement du "System.Web.Extensions.dll" dans "Références supplémentaires"
  • Ajout d'un "Importations d'espaces de noms supplémentaires" de "System.Web.Script.Serialization".

J'espère que ça aide!

void Main()
{
  string json = @"
  {
    'glossary': 
    {
      'title': 'example glossary',
        'GlossDiv': 
        {
          'title': 'S',
          'GlossList': 
          {
            'GlossEntry': 
            {
              'ID': 'SGML',
              'ItemNumber': 2,          
              'SortAs': 'SGML',
              'GlossTerm': 'Standard Generalized Markup Language',
              'Acronym': 'SGML',
              'Abbrev': 'ISO 8879:1986',
              'GlossDef': 
              {
                'para': 'A meta-markup language, used to create markup languages such as DocBook.',
                'GlossSeeAlso': ['GML', 'XML']
              },
              'GlossSee': 'markup'
            }
          }
        }
    }
  }

  ";

  var d = new JsonDeserializer(json);
  d.GetString("glossary.title").Dump();
  d.GetString("glossary.GlossDiv.title").Dump();  
  d.GetString("glossary.GlossDiv.GlossList.GlossEntry.ID").Dump();  
  d.GetInt("glossary.GlossDiv.GlossList.GlossEntry.ItemNumber").Dump();    
  d.GetObject("glossary.GlossDiv.GlossList.GlossEntry.GlossDef").Dump();   
  d.GetObject("glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso").Dump(); 
  d.GetObject("Some Path That Doesnt Exist.Or.Another").Dump();   
}


// Define other methods and classes here

public class JsonDeserializer
{
  private IDictionary<string, object> jsonData { get; set; }

  public JsonDeserializer(string json)
  {
    var json_serializer = new JavaScriptSerializer();

    jsonData = (IDictionary<string, object>)json_serializer.DeserializeObject(json);
  }

  public string GetString(string path)
  {
    return (string) GetObject(path);
  }

  public int? GetInt(string path)
  {
    int? result = null;

    object o = GetObject(path);
    if (o == null)
    {
      return result;
    }

    if (o is string)
    {
      result = Int32.Parse((string)o);
    }
    else
    {
      result = (Int32) o;
    }

    return result;
  }

  public object GetObject(string path)
  {
    object result = null;

    var curr = jsonData;
    var paths = path.Split('.');
    var pathCount = paths.Count();

    try
    {
      for (int i = 0; i < pathCount; i++)
      {
        var key = paths[i];
        if (i == (pathCount - 1))
        {
          result = curr[key];
        }
        else
        {
          curr = (IDictionary<string, object>)curr[key];
        }
      }
    }
    catch
    {
      // Probably means an invalid path (ie object doesn't exist)
    }

    return result;
  }
}
13
Brad Parks

Vous pouvez facilement répondre à vos besoins en utilisant la bibliothèque Newtonsoft.Json. J'écris un exemple ci-dessous jeter un oeil à ce sujet.

Classe pour le type d'objet que vous recevez:

public class User
{
    public int ID { get; set; }
    public string Name { get; set; }

}

Code:

static void Main(string[] args)
{

      string json = "{\"ID\": 1, \"Name\": \"Abdullah\"}";

      User user = JsonConvert.DeserializeObject<User>(json);

      Console.ReadKey();
}

c’est un moyen très simple d’analyser votre json.

11
Mirza Danish Baig

ajoutez ce ddl pour faire référence à votre projet: System.Web.Extensions.dll

utilisez cet espace de noms: en utilisant System.Web.Script.Serialization;

public class IdName
{
    public int Id { get; set; }
    public string Name { get; set; }
}


   string jsonStringSingle = "{'Id': 1, 'Name':'Thulasi Ram.S'}".Replace("'", "\"");
   var entity = new JavaScriptSerializer().Deserialize<IdName>(jsonStringSingle);

   string jsonStringCollection = "[{'Id': 2, 'Name':'Thulasi Ram.S'},{'Id': 2, 'Name':'Raja Ram.S'},{'Id': 3, 'Name':'Ram.S'}]".Replace("'", "\"");
   var collection = new JavaScriptSerializer().Deserialize<IEnumerable<IdName>>(jsonStringCollection);
8
Thulasiram

Comme dit tripletdad99

var result = JsonConvert.DeserializeObject<T>(json);

mais si vous ne voulez pas créer un objet supplémentaire, vous pouvez le faire avec Dictionary

var result = JsonConvert.DeserializeObject<Dictionary<string, string>>(json_serializer);
7
stanimirsp

Un autre moyen rapide et facile d'automatiser ces étapes consiste à:

  1. prenez le JSON que vous souhaitez analyser et collez-le ici: http://json2csharp.com/ puis copiez-collez le résultat dans une nouvelle classe (ex: MyClass) dans Visual Studio.
  2. Renommez "RootObject" dans la sortie de json2csharp en "MyClass" ou comme vous l'avez appelé.
  3. Dans Visual Studio, allez sur Site Web -> Gérer les packages et utilisez NuGet pour ajouter Json.Net de Newtonsoft.

Maintenant, utilisez un code comme:

WebClient client = new WebClient();

string myJSON = client.DownloadString("https://URL_FOR_JSON.com/JSON_STUFF");

var myClass = Newtonsoft.Json.JsonConvert.DeserializeObject(myJSON);
4
Jason Hitchings

Copiez votre Json et collez-le dans la zone de texte sur json2csharp et cliquez sur le bouton Générer.

Une classe cs sera générée, utilisez ce fichier cs comme ci-dessous

var generatedcsResponce = JsonConvert.DeserializeObject(yourJson);

RootObject est le nom du fichier cs généré;

3
Islam

Vous devez d’abord inclure une bibliothèque comme:

using System.Runtime.Serialization.Json;

DataContractJsonSerializer desc = new DataContractJsonSerializer(typeof(BlogSite));
string json = "{\"Description\":\"Share knowledge\",\"Name\":\"zahid\"}";

using (var ms = new MemoryStream(ASCIIEncoding.ASCII.GetBytes(json)))
{
    BlogSite b = (BlogSite)desc.ReadObject(ms);
    Console.WriteLine(b.Name);
    Console.WriteLine(b.Description);
}
0
Muhammad Zahid

Convertissez une chaîne JSON en objet en C #. Utilisation de test ci-dessous .. sa a fonctionné pour moi. Ici "MenuInfo" est mon objet de classe C #.

JsonTextReader reader = null;
try
{
    WebClient webClient = new WebClient();
    JObject result = JObject.Parse(webClient.DownloadString("YOUR URL"));
    reader = new JsonTextReader(new System.IO.StringReader(result.ToString()));
    reader.SupportMultipleContent = true;
}
catch(Exception)
{}

JsonSerializer serializer = new JsonSerializer();
MenuInfo menuInfo = serializer.Deserialize<MenuInfo>(reader);
0
Bhaskar