将JSON字符串解析为List <string>

Cha*_*Jar 7 c# json list

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)


Ken*_* K. 8

由于您使用的是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)

  • 当然。你发帖的时候我还在打字。我确实赞扬了您也用来生成课程的网站;) (2认同)