Ich hatte das gleiche Problem, also habe ich es selbst geschrieben. Diese Lösung unterscheidet sich von anderen Antworten, weil sie in mehrere Ebenen deserialisieren kann.
Senden Sie einfach einen JSON-String an deserializeToDictionary Funktion wird sie nicht stark typisiert zurückgeben Dictionary<string, object>
Objekt.
Alter Code
private Dictionary<string, object> deserializeToDictionary(string jo)
{
var values = JsonConvert.DeserializeObject<Dictionary<string, object>>(jo);
var values2 = new Dictionary<string, object>();
foreach (KeyValuePair<string, object> d in values)
{
// if (d.Value.GetType().FullName.Contains("Newtonsoft.Json.Linq.JObject"))
if (d.Value is JObject)
{
values2.Add(d.Key, deserializeToDictionary(d.Value.ToString()));
}
else
{
values2.Add(d.Key, d.Value);
}
}
return values2;
}
Beispiel: Dies ergibt Dictionary<string, object>
Objekt einer Facebook JSON-Antwort.
Test
private void button1_Click(object sender, EventArgs e)
{
string responsestring = "{\"id\":\"721055828\",\"name\":\"Dasun Sameera Weerasinghe\",\"first_name\":\"Dasun\",\"middle_name\":\"Sameera\",\"last_name\":\"Weerasinghe\",\"username\":\"dasun\",\"gender\":\"male\",\"locale\":\"en_US\", hometown: {id: \"108388329191258\", name: \"Moratuwa, Sri Lanka\",}}";
Dictionary<string, object> values = deserializeToDictionary(responsestring);
}
Anmerkung: Die Heimatstadt wird weiter zu einem Dictionary<string, object>
Objekt.
Update
Meine alte Antwort funktioniert gut, wenn es kein Array auf JSON-String ist. Diese weiter deserialisieren in eine List<object>
wenn ein Element ein Array ist.
Senden Sie einfach einen JSON-String an deserializeToDictionaryOrList Funktion wird sie nicht stark typisiert zurückgeben Dictionary<string, object>
Objekt oder List<object>
.
private static object deserializeToDictionaryOrList(string jo,bool isArray=false)
{
if (!isArray)
{
isArray = jo.Substring(0, 1) == "[";
}
if (!isArray)
{
var values = JsonConvert.DeserializeObject<Dictionary<string, object>>(jo);
var values2 = new Dictionary<string, object>();
foreach (KeyValuePair<string, object> d in values)
{
if (d.Value is JObject)
{
values2.Add(d.Key, deserializeToDictionary(d.Value.ToString()));
}
else if (d.Value is JArray)
{
values2.Add(d.Key, deserializeToDictionary(d.Value.ToString(), true));
}
else
{
values2.Add(d.Key, d.Value);
}
}
return values2;
}else
{
var values = JsonConvert.DeserializeObject<List<object>>(jo);
var values2 = new List<object>();
foreach (var d in values)
{
if (d is JObject)
{
values2.Add(deserializeToDictionary(d.ToString()));
}
else if (d is JArray)
{
values2.Add(deserializeToDictionary(d.ToString(), true));
}
else
{
values2.Add(d);
}
}
return values2;
}
}
1 Stimmen
Zu: Einschränkung 3,
JavaScriptSerizlizer
wird in ASP.NET MVC verwendet und ist nicht mehr veraltet.37 Stimmen
Es ist unglaublich, wie schwierig es war, einen einfachen Weg zu finden, um eine json-Zeichenfolge in etwas zu konvertieren, das ich leicht verwenden konnte, ohne durch viele verschiedene Stackoverflow zu blättern. Es ist so einfach in anderen Sprachen noch Java und C# scheint zu gehen aus dem Weg zu machen das Leben schwer.