1

我收到了来自 Klout API 的回复。响应具有以下字段

  • 姓名
  • 分数
  • 分数增量
    • 换天
    • 周变化
    • 月份变化

我在 .NET 中创建了类,并使用 JSON 响应填充对象。这工作正常,但有时我的 JSON 响应中没有 ScoreDeltas。我如何现场检查这个?

JavaScriptSerializer _jsserializer = new JavaScriptSerializer();
var list = _jsserializer.Deserialize<List<KloutInfluencer>>(influencer as string);

//KloutInfluencer is the ckass with all fields.

它给了我NullReference这个

public double dayChange
{
    get { return entity.payload.scoreDeltas.dayChange ; }
}

这是因为 JSON 响应中没有 ScoreDelta 元素(对于这个 id)。如何在运行时检查?

4

2 回答 2

1

选项 1 - 在您的物业内处理:

你可以这样写:

public double dayChange
{
    get { return entity.payload.scoreDeltas == null ? 0 : entity.payload.scoreDeltas.dayChange }
}

选项 2 - 为所有对象手动反序列化后处理:

实际上你需要决定一个默认值——这可能是可以接受的。您可以手动完成将 scoreDeltas 设置为新实例的列表。像这样的东西:

list.ForEach( entry => entry.scoreDeltas = entry.scoreDeltas ?? new ScoreDealtas() );
// On my MAC currently, untested, should show an idea

选项 3 - 在每个对象内反序列化后直接处理:

Microsoft 还为您提供了一个您可以实现的接口,当反序列化对象时调用该接口(IDeserializationCallback, http: //msdn.microsoft.com/en-us/library/system.runtime.serialization.ideserializationcallback.aspx)。如果你在KloutInfluencer类中实现这个,你可以处理那些因为 json 没有提供值而留空的属性。

于 2012-07-01T13:04:19.103 回答
1

您可以将类的dayChange属性更改KloutInfluencer为可为空,然后检查是否scoreDeltas设置了有效负载的属性。

public double? dayChange
{
    get
    {
        if (null == entity ||
            null == entity.payload ||
            null == entity.payload.scoreDeltas)
        {
            return null;
        }

        return entity.payload.scoreDeltas.dayChange;
    }
}
于 2012-07-01T13:04:54.763 回答