【问题标题】:How Do I De-Serialize JSON From the Facebook Graph API?如何从 Facebook Graph API 反序列化 JSON?
【发布时间】:2010-07-16 01:12:53
【问题描述】:

所以我正在尝试反序列化从 Graph API OAuth 令牌调用返回的 JSON。

JSON 看起来像这样:

"[{\"access_token\":\"bunchofjsondatablahblah",\"expires\":9999}]"

我正在尝试将其反序列化(使用DataContractJsonSerializer 类)到这个对象中:

[DataContract]
internal class FacebookOAuthToken
{
     [DataMember]
     internal string access_token;

     [DataMember]
     internal string expires;
}

这是我(尝试)如何做到的:

FacebookOAuthToken token;
using (Stream responseStream = (response.GetReponseStream()))
{
   DataContractJsonSerializer json = new DataContractJsonSerializer(typeof(FacebookOAuthToken));
   token = (FacebookOAuthToken)json.ReadObject(responseStream);
}

此技术基于来自 MSDN 的 this 文章。

但是,token 的属性始终为空。

而如果我执行responseStream.ReadToEnd(),一切都很好(返回上面的 JSON)——这意味着实际的 HTTP 请求/响应没有问题,我只是没有正确反序列化它。

我做错了什么?

【问题讨论】:

  • 只是出于好奇,如果你在 using 语句的内容周围抛出一个 try/catch ......是否会抛出任何异常?
  • 没有抛出异常。我认为这是使用 Stream 的问题。也许我应该使用 StreamReader 或其他东西......所以我现在正在玩这个。我也在考虑改用 JavaScriptSerializor ..
  • 您可以尝试将流的位置设置为 0 吗?
  • 我现在遇到了一个异常 - “遇到了意外的字符 'a'。”。我之前没有遇到异常,因为 API 没有返回任何内容 - 显然 Facebook 在他们做出更改后今天遇到了一些问题 - 很多 API 调用都达到了 500 次。
  • @pbz - 如果我尝试将流设置为位置 0,我会收到“NotSupportedException - 此流不支持查找操作”。认为你只能使用 StreamReader 设置位置

标签: c# .net json facebook serialization


【解决方案1】:

好吧,事实证明我使用了错误的 Graph API URL(看起来如此)。

这是 Facebook API 文档的问题,它无处不在,并且不同的线程(谷歌、堆栈溢出)说不同的方式来做事。

我更改为 URL https://graph.facebook.com/oauth/access_token?{0} 而不是 https://graph.facebook.com/oauth/exchange_sessions?{0},它现在返回一个基本字符串(非 JSON)。

所以根本不需要序列化。

不过,有些人可能和我上面的问题一样,在那种情况下我不知道如何解决。

我现在使用here定义的方法。

【讨论】:

    【解决方案2】:

    如果我正确解释 JSON 字符串,它表示 FacebookOAuthToken 项目的集合,其中包含一个实例,而不仅仅是一个令牌。

    也许这就是您的反序列化不起作用的原因。

    【讨论】:

    • 是的。好点子。我现在可以进行反序列化 - 通过使用(叹息)不同的 Facebook Graph API(请参阅下面的答案)。使用这个新 API,您不需要反序列化令牌,但您确实需要反序列化其他 api 调用 - 使用上面的原始代码,可以正常工作。我原来问题的原因是今天发生的间歇性FB连接问题(服务器是500'ing)
    猜你喜欢
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2014-04-27
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    相关资源
    最近更新 更多