Versuchen Sie, eine JSON-Zeichenfolge in ein Objekt in C# zu konvertieren. Mit einer wirklich einfachen Testfall:
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
object routes_list = json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Das Problem ist, dass routes_list nie gesetzt wird; es ist ein undefiniertes Objekt. Irgendwelche Ideen?
Es sieht so aus, als würden Sie versuchen, in ein Rohobjekt zu deserialisieren. Sie könnten eine Klasse erstellen, die das Objekt repräsentiert, in das Sie konvertieren wollen. Dies wäre vor allem dann sinnvoll, wenn Sie mit größeren Objekten oder JSON-Strings arbeiten.
Zum Beispiel:
class Test {
String test;
String getTest() { return test; }
void setTest(String test) { this.test = test; }
}
Dann wäre Ihr Deserialisierungscode wie folgt:
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
Test routes_list =
(Test)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Weitere Informationen finden Sie in diesem Tutorial: http://www.codeproject.com/Tips/79435/Deserialize-JSON-with-Csharp.aspx
Wahrscheinlich wollen Sie routes_list nicht einfach als Objekt
-Typ deklarieren. Es hat keine .test-Eigenschaft, so dass Sie nicht wirklich ein schönes Objekt zurückbekommen werden. Dies ist eine der Stellen, an denen es besser ist, eine Klasse oder eine Struktur zu definieren oder das dynamische Schlüsselwort zu verwenden.
Wenn Sie wirklich wollen, dass dieser Code so funktioniert, wie Sie ihn haben, müssen Sie wissen, dass das von DeserializeObject zurückgegebene Objekt ein generisches Wörterbuch von string,object ist. Hier's der Code, um es auf diese Weise zu tun:
var json_serializer = new JavaScriptSerializer();
var routes_list = (IDictionary<string, object>)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Console.WriteLine(routes_list["test"]);
Wenn Sie das dynamische Schlüsselwort verwenden möchten, können Sie hier nachlesen, wie.
Wenn Sie eine Klasse oder Struktur deklarieren, können Sie Deserialize anstelle von DeserializeObject wie folgt aufrufen:
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);
}
}
Hier ist eine einfache Klasse, die ich aus verschiedenen Beiträgen zusammengeschustert habe.... Es ist für etwa 15 Minuten getestet, aber scheint für meine Zwecke zu arbeiten. Es verwendet JavascriptSerializer
, um die Arbeit zu tun, die in Ihrem app mit den Informationen detailliert [in diesem Beitrag] (https://stackoverflow.com/q/7000811/26510) referenziert werden kann.
Der untenstehende Code kann in LinqPad ausgeführt werden, um ihn zu testen:
Hoffentlich hilft das!
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;
}
}