NullReferenceException on ForEach JSON c#

本文关键字:JSON ForEach on NullReferenceException | 更新日期: 2024-10-20 19:00:30

我对以下代码有问题。它使用Facebook c#SDK。问题是,我正在提取并打印我所有朋友的工作历史列表。然而,当这些数据不可用时,我认为这会导致NullReferenceException。我在网上看了很多解决方案,但没有找到一个有效的解决方案。如有任何帮助,我们将不胜感激。

public partial class WebForm1 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        var accessToken = "...";
        var client = new FacebookClient(accessToken);
        dynamic myInfo = client.Get("me/friends", new { fields = "name,id,work" });
        foreach (dynamic friend in myInfo)
        {
            foreach (dynamic work in myInfo.work) // <---- here
            {
                Response.Write("Employer: " + work.employer.name + "<br/> Position:" + work.position.name + "<br/><br/>");
            }
        }
    }
}

我已经包括了建议的编辑,但现在得到了一个不同的错误:

    namespace WebApplication1.Site
 {
public partial class WebForm1 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

        var accessToken = "xxx";
        var client = new FacebookClient(accessToken);
        dynamic myInfo = client.Get("me/friends", new { fields = "name,id,work" });
        foreach (dynamic friend in myInfo)
        {
            **foreach (dynamic work in friend.work ?? new[] { new { employer = new { name = string.Empty }, position = new { name = string.Empty } } })**
                {
                    Response.Write("Employer: " + myInfo.work.employer.name);
                }
        }

    }
}
}

"System.Collections.Generic.KeyValuePair"不包含第21行上"work"的定义

NullReferenceException on ForEach JSON c#

您可以提供一个空列表来代替null值,以避免null引用异常:

 foreach (dynamic work in friend.work ?? new List<string>())

您得到异常是因为foreach对null值调用.GetEnumerator()。我用了一个新的列表,但放在这里什么并不重要。。只要它不是null并且是可枚举的。

编辑

你可以提供一个匿名类型,提供你需要的属性:

 foreach (dynamic work in friend.work ?? new [] { new { employer = new { name = string.Empty}, position = new { name = string.Empty }}})

只需在启动内部循环之前测试myInfo.work是否为null:

if (myInfo.work != null) {
   foreach (dynamic work in myInfo.work)

此外,我刚刚注意到你可能使用了错误的对象:

if (friend.work != null) {
   foreach (dynamic work in friend.work)

我不熟悉API,但我猜在内部循环中,您可能是在对外部循环中创建的对象的属性进行迭代。

例如:

foreach (dynamic friend in myInfo)
{
    foreach (dynamic work in friend.work) // rather than myInfo.work
    {
        // ...
    }
}

您可能还应该对内部循环进行null检查,以防止出现null引用异常。