J'essaie 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. Une idée ?
Il semble que vous essayez de désérialiser vers un objet brut. Vous pourriez créer une classe qui représente l'objet vers lequel vous vous convertissez. Cela s'avère particulièrement utile dans les cas où vous traitez 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; }
}
Alors votre code de désérialisation serait :
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
Test routes_list =
(Test)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Vous trouverez de plus amples informations dans ce tutoriel : http://www.codeproject.com/Tips/79435/Deserialize-JSON-with-Csharp.aspx
Vous ne voulez probablement pas déclarer routes_list comme un type object
. Il n'a pas de propriété .test, et vous n'obtiendrez donc pas un bel objet en retour. C'est l'un des endroits où il est préférable 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 fait, vous devez savoir que l'objet renvoyé par DeserializeObject est un dictionnaire générique de string,object. 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 souhaitez utiliser le mot-clé dynamic, [vous pouvez lire comment ici][1].
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);
}
}
[1] : https://stackoverflow.com/questions/3142495/deserialize-json-into-c-dynamic-object
Voici une classe simple que j'ai bricolée à partir de divers posts..... Elle a été testée pendant environ 15 minutes, mais semble fonctionner pour mes besoins. Elle utilise JavascriptSerializer
pour faire le travail, qui peut être référencé dans votre application en utilisant les informations détaillées [dans ce post] (https://stackoverflow.com/q/7000811/26510).
Le code ci-dessous peut être exécuté dans LinqPad pour le tester :
J'espère que cela vous aidera !
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;
}
}