Cercando di convertire una stringa JSON in un oggetto in C#. Usando un caso di test molto semplice:
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
object routes_list = json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Il problema è che routes_list non viene mai impostato; è un oggetto indefinito. Qualche idea?
Sembra che tu stia cercando di deserializzare un oggetto grezzo. Potresti creare una classe che rappresenti l'oggetto che stai convertendo. Questo sarebbe più utile nei casi in cui hai a che fare con oggetti più grandi o stringhe JSON.
Per esempio:
class Test {
String test;
String getTest() { return test; }
void setTest(String test) { this.test = test; }
}
Allora il tuo codice di deserializzazione sarebbe:
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
Test routes_list =
(Test)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Maggiori informazioni possono essere trovate in questo tutorial: http://www.codeproject.com/Tips/79435/Deserialize-JSON-with-Csharp.aspx
Probabilmente non volete dichiarare routes_list come un tipo object
. Non ha una proprietà .test, quindi non otterrete davvero un bell'oggetto indietro. Questo è uno di quei posti dove sarebbe meglio definire una classe o una struct, o fare uso della parola chiave dynamic.
Se volete davvero che questo codice funzioni come lo avete voi, avrete bisogno di sapere che l'oggetto restituito da DeserializeObject è un generico dizionario di stringhe, oggetto. Ecco il codice per farlo in questo modo:
var json_serializer = new JavaScriptSerializer();
var routes_list = (IDictionary<string, object>)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Console.WriteLine(routes_list["test"]);
Se volete usare la parola chiave dynamic, potete leggere come qui.
Se dichiarate una classe o una struct, potete chiamare Deserialize invece di DeserializeObject in questo modo:
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);
}
}
Ecco una semplice classe che ho messo insieme da vari post.... È stata testata per circa 15 minuti, ma sembra funzionare per i miei scopi. Usa JavascriptSerializer
per fare il lavoro, che può essere referenziato nella tua app usando le informazioni dettagliate in questo post.
Il codice seguente può essere eseguito in LinqPad per testarlo:
Spero sia d'aiuto!
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;
}
}