【问题标题】:How to itrate JSON object?如何迭代 JSON 对象?
【发布时间】:2017-05-21 03:00:19
【问题描述】:

我试图从 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。我尝试了网上的一些方法,但没有成功。

我该怎么办?

【问题讨论】:

标签: c# json loops iteration


【解决方案1】:

首先是您的 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);
            }
        }

    }

【讨论】:

  • 很抱歉给您带来不便,是的,我在这个问题中错过了 commaclass user 但它存在于我的代码中,当我尝试保留“ [", "]" 在 json 刺痛中我得到以下错误 无法将类型为 'Newtonsoft.Json.Linq.JArray' 的对象转换为类型 'Newtonsoft.Json.Linq.JObject'。跨度>
  • 您是否使用我在回答反序列化时给出的相同代码?
  • @PankajKapare 不,我尝试了问题中的代码。
  • 该代码的问题是您不会获得强类型代码。最好使用强类型代码。但是,您仍然可以通过一些修改使其工作。问题在于这一行 JObject o2 = (JObject)JToken.ReadFrom(reader);在这里,您尝试将数组类型化为单个对象。
  • 你是对的,当我在 json 文件中添加 [,] 时,我在 JObject o2 = (JObject)JToken.ReadFrom(reader) 行中遇到了异常。
【解决方案2】:
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);
}

【讨论】:

  • 谢谢!为您的回应。我修改了我的代码,但现在我得到“无法使用 [] 将索引应用于 'KeyValuePair' 类型的表达式”异常
【解决方案3】:

我建议使用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

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));

【讨论】:

  • 非常感谢您的帮助,现在它可以工作了。谢谢。
【解决方案4】:

例如,尝试创建代表 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 和电子邮件

【讨论】:

    猜你喜欢
    • 2019-07-21
    • 2016-01-25
    • 1970-01-01
    • 2022-01-23
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多