Pokus o konverziu reťazca JSON na objekt v jazyku C#. Pomocou naozaj jednoduchého testovacieho prípadu:
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
object routes_list = json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Problémom je, že routes_list sa nikdy nenastaví; je to nedefinovaný objekt. Nejaké nápady?
Vyzerá to tak, že sa snažíte deserializovať na surový objekt. Mohli by ste vytvoriť triedu, ktorá by reprezentovala objekt, na ktorý konvertujete. To by bolo najužitočnejšie v prípadoch, keď pracujete s väčšími objektmi alebo reťazcami JSON.
Napríklad:
class Test {
String test;
String getTest() { return test; }
void setTest(String test) { this.test = test; }
}
Potom by váš deserializačný kód bol:
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
Test routes_list =
(Test)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Viac informácií nájdete v tomto návode: http://www.codeproject.com/Tips/79435/Deserialize-JSON-with-Csharp.aspx
Pravdepodobne nechcete len deklarovať routes_list ako typ object
. Nemá vlastnosť .test, takže naozaj nedostanete späť pekný objekt. Toto je jedno z tých miest, kde by bolo lepšie definovať triedu alebo štruktúru, alebo využiť kľúčové slovo dynamic.
Ak naozaj chcete, aby tento kód fungoval tak, ako ho máte, budete'musieť vedieť, že objekt vrátený funkciou DeserializeObject je všeobecný slovník string,object. Tu'je kód, ktorý to robí týmto spôsobom:
var json_serializer = new JavaScriptSerializer();
var routes_list = (IDictionary<string, object>)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Console.WriteLine(routes_list["test"]);
Ak chcete použiť dynamické kľúčové slovo, tu si môžete prečítať ako.
Ak deklarujete triedu alebo štruktúru, môžete zavolať Deserialize namiesto DeserializeObject takto:
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);
}
}
Tu je jednoduchá trieda, ktorú som poskladal z rôznych príspevkov.... Bola testovaná asi 15 minút, ale zdá sa, že pre moje účely funguje. Na prácu používa JavascriptSerializer
, na ktorý sa môžete vo svojej aplikácii odvolať pomocou podrobných informácií v tomto príspevku.
Nižšie uvedený kód môžete spustiť v programe LinqPad a otestovať ho:
Dúfam, že to pomôže!
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;
}
}