Intentando convertir una cadena JSON en un objeto en C#. Usando un caso de prueba realmente simple:
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
object routes_list = json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
El problema es que routes_list nunca se establece; es un objeto indefinido. ¿Alguna idea?
Parece que estás tratando de deserializar a un objeto crudo. Podría crear una clase que represente el objeto al que está convirtiendo. Esto sería muy útil en los casos en los que se trata de objetos más grandes o cadenas JSON.
Por ejemplo:
class Test {
String test;
String getTest() { return test; }
void setTest(String test) { this.test = test; }
}
Entonces tu código de deserialización sería
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
Test routes_list =
(Test)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Puedes encontrar más información en este tutorial: http://www.codeproject.com/Tips/79435/Deserialize-JSON-with-Csharp.aspx
Probablemente no quiera declarar routes_list como un tipo objeto
. No tiene una propiedad .test, por lo que no va a obtener un objeto agradable. Este es uno de esos lugares donde sería mejor definir una clase o una estructura, o hacer uso de la palabra clave dynamic.
Si realmente quieres que este código funcione como lo tienes, necesitarás saber que el objeto devuelto por DeserializeObject es un diccionario genérico de string,object. Aquí'está el código para hacerlo así:
var json_serializer = new JavaScriptSerializer();
var routes_list = (IDictionary<string, object>)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Console.WriteLine(routes_list["test"]);
Si quieres usar la palabra clave dinámica, puedes leer cómo aquí.
Si declaras una clase o estructura, puedes llamar a Deserialize en lugar de DeserializeObject así:
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);
}
}
Aquí's una clase simple que improvisé a partir de varios posts.... Ha sido probada durante unos 15 minutos, pero parece que funciona para mis propósitos. Utiliza JavascriptSerializer
para hacer el trabajo, que puede ser referenciado en su aplicación utilizando la información detallada en este post.
El siguiente código puede ser ejecutado en LinqPad para probarlo:
¡Espero que sea de ayuda!
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;
}
}