string json = "{\"People\":[{\"FirstName\":\"Hans\",\"LastName\":\"Olo\"}
{\"FirstName\":\"Jimmy\",\"LastName\":\"Crackedcorn\"}]}";
var obj = JObject.Parse(json);
List<string> first;
List<string> last;
foreach (var child in obj["People"].Children())
{
var name = child.First()["countryName"].ToString();
var two = child.First()["countryCode"].ToString();
var three = child.First()["isoAlpha3"].ToString();
countries.Add(name);
twoCharCodes.Add(two);
threeCharCodes.Add(three);
Console.Write("Name:\t\t{0}\n2CharCode:\t{1}\n3CharCode:\t{2}\n\n", name, two, three);
}
Ich bin auf der Suche nach einer Möglichkeit, jeden FirstName-Wert in die erste Liste und den LastName-Wert und die letzte Liste einzufügen. Was ist der beste Weg, dies zu tun?
Der obige Code bricht ab bei:
var name = child.First()["countryName"].ToString();
mit diesem Fehler:
Cannot access child value on Newtonsoft.Json.Linq.JProperty
Irgendein Rat?
Es scheint ein schlechter Weg zu sein (zwei korrelierte Listen zu erstellen), aber ich gehe davon aus, dass Sie Ihre Gründe dafür haben.
Ich würde den JSON-String (der in Ihrem Beispiel einen Tippfehler hat, ein Komma zwischen den beiden Objekten fehlt) in ein stark typisiertes Objekt parsen und dann ein paar LINQ-Abfragen verwenden, um die beiden Listen zu erhalten.
void Main()
{
string json = "{\"People\":[{\"FirstName\":\"Hans\",\"LastName\":\"Olo\"},{\"FirstName\":\"Jimmy\",\"LastName\":\"Crackedcorn\"}]}";
var result = JsonConvert.DeserializeObject<RootObject>(json);
var firstNames = result.People.Select (p => p.FirstName).ToList();
var lastNames = result.People.Select (p => p.LastName).ToList();
}
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class RootObject
{
public List<Person> People { get; set; }
}
Da Sie JSON.NET verwenden, würde ich mich persönlich für die Serialisierung entscheiden, damit Sie Intellisense-Unterstützung für Ihr Objekt haben können. Sie benötigen eine Klasse, die Ihre JSON-Struktur darstellt. Sie können dies von Hand erstellen oder Sie können etwas wie json2csharp verwenden, um es für Sie zu generieren:
z.B.
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class RootObject
{
public List<Person> People { get; set; }
}
Dann können Sie einfach die Methoden von JsonConvert
aufrufen, um die JSON in ein Objekt zu deserialisieren:
RootObject instance = JsonConvert.Deserialize<RootObject>(json);
Dann haben Sie Intellisense:
var firstName = instance.People[0].FirstName;
var lastName = instance.People[0].LastName;
Wollte dies als Kommentar als Randnotiz zur akzeptierten Antwort posten, aber das wurde ein wenig unklar ..__ So rein als Randnotiz:
Wenn Sie die Objekte selbst nicht benötigen und Ihr Projekt von weiteren ungenutzten Klassen befreit werden soll, können Sie Folgendes analysieren:
var list = JObject.Parse(json)["People"].Select(el => new { FirstName = (string)el["FirstName"], LastName = (string)el["LastName"] }).ToList();
var firstNames = list.Select(p => p.FirstName).ToList();
var lastNames = list.Select(p => p.LastName).ToList();
Selbst wenn Sie eine stark typisierte Personenklasse verwenden, können Sie das Stammobjekt immer noch überspringen, indem Sie eine Liste mit JObject.Parse(json)["People"].ToObject<List<Person>>()
.__ erstellen. Wenn Sie die Objekte jedoch wiederverwenden möchten, sollten Sie sie natürlich von Anfang an erstellen. Wollte nur auf die Alternative hinweisen;)
Ich verwende diese JSON-Helper-Klasse in meinen Projekten. Ich habe es vor einem Jahr im Netz gefunden, aber die Quell-URL verloren. Also füge ich es direkt aus meinem Projekt ein:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Runtime.Serialization.Json;
using System.IO;
using System.Text;
/// <summary>
/// JSON Serialization and Deserialization Assistant Class
/// </summary>
public class JsonHelper
{
/// <summary>
/// JSON Serialization
/// </summary>
public static string JsonSerializer<T> (T t)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream();
ser.WriteObject(ms, t);
string jsonString = Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
return jsonString;
}
/// <summary>
/// JSON Deserialization
/// </summary>
public static T JsonDeserialize<T> (string jsonString)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
T obj = (T)ser.ReadObject(ms);
return obj;
}
}
Sie können es folgendermaßen verwenden: Erstellen Sie die Klassen, wie Craig W. vorgeschlagen hat.
Und dann deserialisieren
RootObject root = JSONHelper.JsonDeserialize<RootObject>(json);