如何访问嵌套列表的键/值

本文关键字:列表 嵌套 何访问 访问 | 更新日期: 2023-09-27 18:25:56

我正在使用一个名为prime[31]社交网络插件的统一插件来处理Facebook。它适用于这样的东西:

void onGraph()
    {
        Facebook.instance.graphRequest( "me", HTTPVerb.GET, ( error, obj ) =>
        {
            // if we have an error we dont proceed any further
            if( error != null )
                return;             
            if( obj == null )
                return;             
            // grab the userId and persist it for later use
            var ht = obj as Dictionary<string,object>;
            _userId = ht["id"].ToString();      
            Debug.Log( "me Graph Request finished: " + _userId );
            Prime31.Utils.logObject( ht );
        } );
    }

它返回这个:

 --------- IDictionary ---------
id: ########## 
name: Mike O'Connor 
first_name: Mike 
last_name: O'Connor 
link: https://www.facebook.com/########## 
username: ########## 
etc...

我似乎可以抓住任何一个键,把它塞进这样的变量中,对吧?:

_userId = ht["id"].ToString();

但当我要求每个玩我游戏的人的分数时:?

void onGetScore()
    {
        Facebook.instance.graphRequest( "AppID/scores", HTTPVerb.GET, ( error, obj ) =>
        {
            // if we have an error we dont proceed any further
            if( error != null )
                return;
            if( obj == null )
                return;
            // grab the userId and persist it for later use
            var ht = obj as Dictionary<string, object>;
            _score = ht["score"].ToString();
            Prime31.Utils.logObject( ht );
        } );
    }

它返回一个嵌套的字典/列表,如下所示:

 --------- IDictionary --------- 
 --------- IList --------- 
data: 
    --------- IDictionary ---------
    user:    --------- IDictionary ---------
        name:   Mike O'Connor
        id:     ##########
        score:  5677
        application:     --------- IDictionary ---------
            name:   ##########
            namespace:  ##########
            id:     ##########

现在它是嵌套的,所以我不能使用它,对吧?

_score = ht["score"].ToString();

如何获取嵌套键?这只是一个语法问题,还是我必须重写(或其他什么)?

如何访问嵌套列表的键/值

那么您想访问字典、字典、列表、字典中的键值对的值吗?

听起来你想要这个:

_score = ht["data"][0]["score"].ToString();

注意,这里的0表示ht["data"]列表中的第一个项目。

不幸的是,看起来您的对象可能是弱类型的。在这种情况下,你必须做:

_score = 
    ((IDictionary<string, object>)
        ((IList<object>)ht["data"])[0])["score"].ToString();

这看起来很糟糕,但应该有效(假设返回的类型确实是您所描述的)。

要获得一组用户名/分数对,可以使用类似以下Linq查询的东西:

var scores = 
    from item in ((IList<object>)ht["data"]).Cast<IDictionary<string, object>>()
    let name = ((IDictionary<string, object>)item["user"])["name"].ToString()
    let score = item["score"].ToString()
    select new { username = name, score };

您将需要更改属性访问逻辑。ht["score"]已经不存在了(或者至少不在外部级别,它在字典中的列表中的字典中)。相反,它将像ht["list1"].First()["score"].ToString(),但我不确定确切的路径是什么,因为您的数据格式不清楚。你能用原始响应更新吗?那我可以肯定地告诉你。此外,我认为您可能需要进行一些迭代。因为结构被嵌套多次以获得内部值,所以您必须迭代外部字典,然后迭代它所包含的列表,然后访问列表所包含的字典中的值。