我正在使用统一插件处理Facebook名为prime [31]社交网络插件。它适用于这样的事情:
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();
如何获得嵌套密钥?它只是一个语法问题还是我必须重铸(或其他)?
答案 0 :(得分:1)
因此,您想要在字典内,字典内,列表内,字典内访问键值对的值吗?
听起来你想要这个:
_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 };
答案 1 :(得分:0)
您将需要更改属性访问逻辑。 ht["score"]
不再存在(或者至少不在外层,它位于字典中的字典中)。相反,它将像ht["list1"].First()["score"].ToString()
但是我不确定确切的路径是什么,因为您的数据格式不明确。你能用原始响应更新吗?然后我可以肯定地告诉你。另外,我认为你可能不得不做一些迭代。因为结构嵌套多次以获取内部值,所以必须迭代外部字典,然后迭代它包含的列表,然后访问列表中包含的字典中的值。