【问题标题】:Deserializing Data From Facebook反序列化来自 Facebook 的数据
【发布时间】:2016-01-24 04:28:20
【问题描述】:

我正在使用 Unity 和 Facebook SDK。

目前我正在使用图形 API 检索安装了应用程序的用户朋友列表:

返回时的数据如下:

{
"data": [
{
  "installed": true,
  "id": "1292282928282"
},
{
  "installed": true,
  "id": "29282829292"
}
],
"paging": {
"next": "https://graph.facebook.com/v2.5/105157539862931/friends?fields=installed&format=json&access_token=CAALVPHznNpcBAOnO94HvqUgYKI2kObPZBgR0sqIOMSRO9swZBBTWHb6FjliZCT1KyCmPbnX42xvtngboh3DjFOrixw0pSenwRZA1oXZAHNDdYcGsHNOHjQcZB0f6fsZBQJjhOTttwQu7E5hZBDcAWJVZBGK2AxrZBDZBxLL7I5pjXwwbb12hDytZAiVzUmNzi1Ae2CCvOnL6QCpqzsJT7fWWjXXi&limit=25&offset=25&__after_id=enc_AdB7PJbXYkDSSZAq33AjPXZAeRnlrZBDwjAAILZAg3emHdei0qdRLa2AeD6sRuX6h0OQuPQi8x8bvSHPy0EqIgybYL89"
},
"summary": {
"total_count": 2
}
}

目前我正试图弄清楚如何从“数据”对象内的每个对象中提取“已安装”和 id。

到目前为止,我正在这样做:

Dictionary<object,object> friendsList = Json.Deserialize (result.RawResult) as Dictionary<object,object>;

但我不确定如何从对象中取出这些特定项目。

有人知道我会怎么做吗?

【问题讨论】:

  • 看看this link
  • 可以,但是本题数据集JSON不同
  • 你会得到一个Dictionary 反对data。当然是通过object,然后在Dictionary中解析那个object(Dictionary)。对于自挖掘,首先通过var 获取变量是什么,然后打印它的Type,然后进行相应的操作。

标签: c# json facebook-unity-sdk


【解决方案1】:

您需要有可以为您保存反序列化数据的类。例如创建以下类:

public class Datum
{
    public bool installed { get; set; }
    public string id { get; set; }
}

public class Paging
{
    public string next { get; set; }
}

public class Summary
{
    public int total_count { get; set; }
}

public class RootObject
{
    public List<Datum> data { get; set; }
    public Paging paging { get; set; }
    public Summary summary { get; set; }
}

RootObject 是根类,因此反序列化代码为:

var deserialized = Json.Deserialize<RootObject>(result.RawResult);

还有另一种方法可以在不创建类的情况下使用 dynamic 关键字:

static void Main(string[] args)
    {

      var stringVal = @"{
    ""data"": [
    {
  ""installed"": true,
      ""id"": ""1292282928282""
},
{
    ""installed"": true,
  ""id"": ""29282829292""
}
],
""paging"": {
    ""next"": ""https://graph.facebook.com/v2.5/105157539862931/friends?        fields=installed&format=json&access_token=CAALVPHznNpcBAOnO94HvqUgYKI2kObPZBgR0sqIOMSRO9swZBBTWHb6FjliZCT1KyCmPbnX42xvtngboh3DjFOrixw0pSenwRZA1oXZAHNDdYcGsHNOHjQcZB0f6fsZBQJjhOTttwQu7E5hZBDcAWJVZBGK2AxrZBDZBxLL7I5pjXwwbb12hDytZAiVzUmNzi1Ae2CCvOnL6QCpqzsJT7fWWjXXi&limit=25&offset=25&__after_id=enc_AdB7PJbXYkDSSZAq33AjPXZAeRnlrZBDwjAAILZAg3emHdei0qdRLa2AeD6sRuX6h0OQuPQi8x8bvSHPy0EqIgybYL89""
},
""summary"": {
    ""total_count"": 2
}
}";

      dynamic x = JsonConvert.DeserializeObject(stringVal);
      var data = x.data;
    foreach(var d in data)
    {
      bool installed = d.installed;
      long id = d.id;
      // todo: use the id and installed 
    }

【讨论】:

  • 好的,我现在已经设置好了,但现在我收到错误消息:“Facebook.MiniJSON”没有 RootObject 朋友的定义 = Json.Deserialize (result.RawResult);所以我猜我需要这样写代码:RootObject friends = Json.Deserialize (result.RawResult) as RootObject; ?
  • 我编辑了我的答案,尝试使用“动态”,在这种情况下您不必创建类。所有成员都匹配 json 中字段的大小写和名称,所以要小心,因为与 json 字段名称不匹配的属性会得到 null。
  • @coder4life22 你试过我的解决方案了吗,它端到端工作,只需复制粘贴。
【解决方案2】:

在 Linqpad 中运行它,它会返回已安装的属性。

void Main()
{
    string jsonText =
@"{
    ""data"": [
    {
  ""installed"": true,
      ""id"": ""1292282928282""
},
{
    ""installed"": true,
  ""id"": ""29282829292""
}
],
""paging"": {
    ""next"": ""https://graph.facebook.com/v2.5/105157539862931/friends?fields=installed&format=json&access_token=CAALVPHznNpcBAOnO94HvqUgYKI2kObPZBgR0sqIOMSRO9swZBBTWHb6FjliZCT1KyCmPbnX42xvtngboh3DjFOrixw0pSenwRZA1oXZAHNDdYcGsHNOHjQcZB0f6fsZBQJjhOTttwQu7E5hZBDcAWJVZBGK2AxrZBDZBxLL7I5pjXwwbb12hDytZAiVzUmNzi1Ae2CCvOnL6QCpqzsJT7fWWjXXi&limit=25&offset=25&__after_id=enc_AdB7PJbXYkDSSZAq33AjPXZAeRnlrZBDwjAAILZAg3emHdei0qdRLa2AeD6sRuX6h0OQuPQi8x8bvSHPy0EqIgybYL89""
},
""summary"": {
    ""total_count"": 2
}
}";

 var x = JsonConvert.DeserializeObject<Response>(jsonText);
 //To Get installed
 x.data.Select(d => d.installed).Dump();
}

public class Response
{ 
    public Data[] data;
    public Paging paging;
    public Summary summary;
}

public class Data
{
    public bool installed { get; set; }
    public string id { get; set; }
}

public class Paging
{
    public string next { get; set; }
}

public class Summary
{
    public int total_count { get; set;}
}

【讨论】:

  • var x = JsonConvert.DeserializeObject(jsonText);我没有这个方法可用
  • 我只能做 var x = Json.Deserialize(text) as Response;并且 Json 在 Facebook.MiniJson 包中
  • 您需要将 Nuget 引用添加到 Newtonsoft json.net。这个库甚至被微软使用。
  • 这在 Unity 中不可用
【解决方案3】:

参考本例使用mini json获取好友列表:https://developers.facebook.com/docs/unity/reference/current/Json

【讨论】:

    猜你喜欢
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 2011-03-03
    相关资源
    最近更新 更多