【问题标题】:Looping through JSON array and adding items to list C#循环遍历 JSON 数组并将项目添加到列表 C#
【发布时间】:2021-02-05 13:25:02
【问题描述】:

对不起,基本问题,我是初学者,试图找到我的问题,但没能找到

string json = "{\"EmailList\":[{\"name\":\"John Bravo\",\"email\":\"email@gmail.com\"},{\"name\":\"Daniel Alutcher\",\"email\":\"email@gmail.com\"},{\"name\":\"James Rodriguez\",\"email\":\"email@gmail.com\"}]}";

JObject rss = JObject.Parse(json);

var data = JsonConvert.DeserializeObject<dynamic>(json);

dynamic emails = data.EmailList;

List<string> emailList = new List<string>();

foreach (dynamic item in emails)
{
    int x = 0;
    if (item.email != null)
    {
        Console.WriteLine(item.email);
        //emailList.Add(item.email); // throws exception System.Collections.Generic.List<string>.Add(string)' has some invalid arguments' 
    }
}

所以我通过这个 JSON 循环,我可以在控制台中获取每封电子邮件,但是当我尝试将它添加到列表时,它会抛出异常错误

【问题讨论】:

  • list.Add(item.email as string);玩得开心:)
  • @Leron_says_get_back_Monica 虽然这将消除异常,但列表将充满nulls,因为动态对象不是字符串。
  • 您可以将整个问题简化为以下代码:dynamic test = new JValue("Test"); new List&lt;string&gt;().Add(test);,我想知道为什么会失败,因为 string s = test; 可以正常工作。

标签: c# arrays json .net loops


【解决方案1】:

您尝试在 List&lt;string&gt; 中添加 dynamic,而不是您应该这样做

emailList.Add(item.email.ToString()); 

代码:

string json =
"{\"EmailList\":[{\"name\":\"John Bravo\",\"email\":\"email@gmail.com\"},{\"name\":\"Daniel Alutcher\",\"email\":\"email@gmail.com\"},{\"name\":\"James Rodriguez\",\"email\":\"email@gmail.com\"}]}";


JObject rss = JObject.Parse(json);

var data = JsonConvert.DeserializeObject<dynamic>(json);

dynamic emails = data.EmailList;

List<string> emailList = new List<string>();

foreach (dynamic item in emails)
{
    int x = 0;
    if (item.email != null)
    {
        Console.WriteLine(item.email);
        emailList.Add(item.email.ToString()); // Change here 
   }
}

【讨论】:

  • 我想知道为什么.Add((string)item.email) 工作得很好,但.Add(item.email) 不行。
  • 当前状态下的 @LasseV.Karlsen IMO item.email 具有动态类型,这不是 Add 所需的字符串。所以我们需要明确地转换它。
  • dynamic 添加到List&lt;string&gt; 应该真的可以正常工作,假设动态中的值可以强制转换为字符串。例如,您可以这样做,它可以工作:string s = item.email; 底层对象的类型为JValue,但同样,它在直接分配给字符串变量时也可以工作,所以我想知道为什么它在调用时不允许这样做一个只接受字符串参数的方法。
  • 我问了一个新问题——stackoverflow.com/questions/64484213/…
  • @LasseV.Karlsen 我没有看到你编辑过的关于 JValue 的评论,现在我和你一样好奇,按照你提出的问题。感谢您提出这个问题。
【解决方案2】:

正如您所评论的,“有什么办法可以避免在这段代码中出现“动态”吗?”

嗯,这很简单,这是一个简单的复制过去!
在 Visual Studio 中使用顶部栏菜单中的特殊过去 (image)。
或者在app.quicktype.iojson2csharp.com 等在线工具中。

using  Newtonsoft.Json;

public partial class JsonData //Give it a better name
{
       [JsonProperty("EmailList")] public List<EmailInformation> EmailList { get; set; }
}

public partial class EmailInformation
{
       [JsonProperty("name")]  public string Name { get; set; } 
       [JsonProperty("email")] public string Email { get; set; }
}

而且用法也很简单,您的代码中已经包含了大部分内容:

var data = JsonConvert.DeserializeObject<JsonData>(json);

foreach(var mailInfo  in data.EmailList){
       Console.WriteLine($"{mailInfo.Name} <{mailInfo.Email}>;");
}

//here a list of string 
var emails = data.EmailList.Select(x=> x.Email).ToList();

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多