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);
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法将每个FirstName值添加到第一个List中,并与LastName值和最后一个List相同.这样做的最佳方法是什么?
上面的代码打破了:
var name = child.First()["countryName"].ToString();
Run Code Online (Sandbox Code Playgroud)
有这个错误:
Cannot access child value on Newtonsoft.Json.Linq.JProperty
Run Code Online (Sandbox Code Playgroud)
有什么建议?
Cra*_* W. 12
似乎是一种不好的方法(创建两个相关的列表),但我假设你有你的理由.
我将JSON字符串(在您的示例中有一个拼写错误,它在两个对象之间缺少逗号)解析为强类型对象,然后使用几个LINQ查询来获取这两个列表.
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; }
}
Run Code Online (Sandbox Code Playgroud)
由于您使用的是JSON.NET,我个人会使用序列化,以便您可以对对象进行Intellisense支持.你需要一个代表你的JSON结构的类.您可以手动构建它,或者您可以使用类似json2csharp的东西为您生成它:
例如
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class RootObject
{
public List<Person> People { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以简单地调用JsonConvert方法将JSON反序列化为对象:
RootObject instance = JsonConvert.Deserialize<RootObject>(json);
Run Code Online (Sandbox Code Playgroud)
然后你有Intellisense:
var firstName = instance.People[0].FirstName;
var lastName = instance.People[0].LastName;
Run Code Online (Sandbox Code Playgroud)