我试图从JSON获取id和电子邮件列表。我怎样才能做到这一点?
我的JSON字符串是
{
"name":"name1",
"username":"name1",
"id":505,
"state":"active",
"email":"name1@mail.com",
},
{
"name":"name2",
"username":"name2",
"id":504,
"state":"active",
"email":"name2@mail.com",
}
我的代码是
Dictionary<string, string> engineers = new Dictionary<string, string>();
using (StreamReader r = new StreamReader(@"D:\project\Gitlap\EngineerEmail\jsonlist5.json"))
{
using (JsonTextReader reader = new JsonTextReader(r))
{
JObject o2 = (JObject)JToken.ReadFrom(reader);
string id = o2["id"].ToString();
string email = o2["email"].ToString();
engineers.Add(email, id);
}
}
class UserItems
{
public string id { get; set; }
public string email { get; set; }
}
我可以获得第一个人的邮件ID和ID详细信息。我需要迭代这个JSON并获取所有邮件ID和ID。
我不知道如何迭代这个JSON。我尝试了一些来自互联网的方法但是没有成功。
我该怎么办?
答案 0 :(得分:2)
首先,你的JSON输入是无效的json,你需要修复它。它有两个问题。它不是两个对象之间缺少的json对象和逗号的集合。 有效的json应如下所示。
[{
"name":"name1",
"username":"name1",
"id":505,
"state":"active",
"email":"name1@mail.com",
},
{
"name":"name2",
"username":"name2",
"id":504,
"state":"active",
"email":"name2@mail.com",
}]
现在定义一个代表你的json对象的c#类。
public class User
{
public string name { get; set; }
public string username { get; set; }
public int id { get; set; }
public string state { get; set; }
public string email { get; set; }
}
使用JSON.Net库对其进行反序列化,如下所示。
private void button1_Click(object sender, EventArgs e)
{
if(File.Exists("json1.json"))
{
string inputJSON = File.ReadAllText("json1.json");
if(!string.IsNullOrWhiteSpace(inputJSON))
{
var userList = JsonConvert.DeserializeObject<List<User>>(inputJSON);
}
}
}
答案 1 :(得分:1)
JObject o2 = (JObject)JToken.ReadFrom(reader);
foreach(var obj in o2)
{
string id = obj["id"].ToString();
string Email= obj["Email"].ToString();
engineers.Add(email, id);
}
答案 2 :(得分:0)
我建议使用Json.NET NuGet package来完成此任务。
首先,创建一个模型来表示您的JSON数据。通常我会在这里大写属性名称的第一个字母,但是为了使它与JSON保持一致,它们是小写的。
public class UserData
{
public string name { get; set; }
public string username { get; set; }
public int id { get; set; }
public string state { get; set; }
public string email { get; set; }
}
您需要为Json.NET添加一个使用
using Newtonsoft.Json;
最后,您可以将数据加载并反序列化为强类型列表,然后可以使用该列表填充工程师词典。
string datapath = @"D:\project\Gitlap\EngineerEmail\jsonlist5.json";
Dictionary<string, string> engineers = new Dictionary<string, string>();
List<UserData> data = new List<UserData>();
using (StreamReader r = new StreamReader(datapath))
{
string json = r.ReadToEnd();
data = JsonConvert.DeserializeObject<List<UserData>>(json);
data.ForEach(engineer => engineers.Add(engineer.email, engineer.id.ToString()));
}
正如另一个答案中所提到的,你的JSON也很糟糕。这将需要更正才能正确反序列化。我们只需要添加一个逗号来分隔这两个对象,并将它们包装在一个JSON数组中,并使用[]
[
{
"name":"name1",
"username":"name1",
"id":505,
"state":"active",
"email":"name1@mail.com"
},
{
"name":"name2",
"username":"name2",
"id":504,
"state":"active",
"email":"name2@mail.com"
}
]
由于您的Id字段是整数,因此最好从
更改字典Dictionary<string, string> engineers = new Dictionary<string, string>();
到
Dictionary<string, int> engineers = new Dictionary<int, string>();
然后,您可以稍微简化ForEach查询。 ForEach也可以移到using()块之外。
data.ForEach(engineer =>
engineers.Add(engineer.email, engineer.id));
这包括上面的改进,我为了简洁起见使用了var。
var datapath = @"D:\project\Gitlap\EngineerEmail\jsonlist5.json";
var engineers = new Dictionary<string, int>();
var data = new List<UserData>();
using (var r = new StreamReader(datapath))
{
var json = r.ReadToEnd();
data = JsonConvert.DeserializeObject<List<UserData>>(json);
}
data.ForEach(engineer =>
engineers.Add(engineer.email, engineer.id));
答案 3 :(得分:-1)
尝试创建表示json对象中数据的类,例如
Class obj
{
public int Id { get ; set; }
public string email { get ; set; }
public string username { get ; set; }
public string state { get ; set; }
public string email { get ; set; }
}
然后
using System.Web.Script.Serialization;
var js = new JavaScriptSerializer();
List<obj> list = js.Deserialize<List<obj>>(jsonString);
之后,您可以使用foreach
访问所有列表项ID和电子邮件