Bir JSON dizesini C#'ta bir nesneye dönüştürmeye çalışıyorum. Gerçekten basit bir test durumu kullanarak:
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
object routes_list = json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Sorun şu ki routes_list asla ayarlanmıyor; tanımlanmamış bir nesne. Herhangi bir fikriniz var mı?
Görünüşe göre ham bir nesneye yeniden seri hale getirmeye çalışıyorsunuz. Dönüştürdüğünüz nesneyi temsil eden bir Sınıf oluşturabilirsiniz. Bu en çok büyük nesneler veya JSON Dizeleri ile uğraştığınız durumlarda faydalı olacaktır.
Mesela:
class Test {
String test;
String getTest() { return test; }
void setTest(String test) { this.test = test; }
}
O zaman serileştirme kodunuz şöyle olacaktır:
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
Test routes_list =
(Test)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Bu eğitimde daha fazla bilgi bulabilirsiniz: http://www.codeproject.com/Tips/79435/Deserialize-JSON-with-Csharp.aspx
Muhtemelen routes_list'i sadece bir object
türü olarak bildirmek istemezsiniz. Bir .test özelliği yoktur, bu yüzden gerçekten güzel bir nesne geri almayacaksınız. Bu, bir sınıf ya da struct tanımlamanın ya da dynamic anahtar sözcüğünü kullanmanın daha iyi olacağı yerlerden biridir.
Bu kodun gerçekten sizde olduğu gibi çalışmasını istiyorsanız, DeserializeObject tarafından döndürülen nesnenin genel bir string,object sözlüğü olduğunu bilmeniz gerekir. İşte bu şekilde yapmak için kod:
var json_serializer = new JavaScriptSerializer();
var routes_list = (IDictionary<string, object>)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Console.WriteLine(routes_list["test"]);
Dinamik anahtar sözcüğünü kullanmak istiyorsanız, nasıl yapılacağını buradan okuyabilirsiniz.
Bir sınıf veya struct bildirirseniz, DeserializeObject yerine Deserialize'ı aşağıdaki gibi çağırabilirsiniz:
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);
}
}
İşte çeşitli yazılardan bir araya getirdiğim basit bir sınıf.... Yaklaşık 15 dakika boyunca test edildi, ancak *amaçlarım için çalışıyor gibi görünüyor. İşi yapmak için JavascriptSerializer
kullanıyor ve bu yazıda ayrıntılı olarak verilen bilgiler kullanılarak uygulamanızda referans gösterilebilir.
Aşağıdaki kod LinqPad'de çalıştırılarak test edilebilir:
Umarım yardımcı olur!
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;
}
}