如何评价JSON对象?

时间:2017-01-06 10:56:01

标签: c# json loops iteration

我试图从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。我尝试了一些来自互联网的方法但是没有成功。

我该怎么办?

4 个答案:

答案 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和电子邮件