2013-03-24 208 views
0

这么长的故事短我有一个android应用程序,我用cocos2dx来开发它。我正在努力的一个组件是将我的Facebook朋友带入我的游戏。我这样做的方式是在本机(Java)我安装我的Facebook的SDK。我成功登录并且毫无问题地拉下我的朋友列表。我的问题是,我需要将这些数据转发到C++端,以便我可以访问数据并将其带入标签等。用Jannson JSON阅读器阅读Facebook响应

这里我猜想一些结构是如何发生的: Java本机 - 启动活动,登录Facebook,结识朋友 - > STRING DATA JNI TO C++ - > CPP用Jannson解析JSON数据。

我的问题是,如果我有这样一个简单的数据:

[ 
    { 
     "pic_square": "https://www.facebook.com/blah", 
     "uid": 4654546445, 
     "name": "somename" 
    } 
] 

我可以分析,没有问题,但在现实中有什么Facebook的回应是这样的:

{ 
    Response: responseCode: 200, 
    graphObject: GraphObject{ 
     graphObjectClass=GraphObject, 
     state={ 
      "data": [ 
       { 
        "pic_square": "https://www.facebook.com/blah", 
        "uid": 4654546445, 
        "name": "somename" 
       } 
      ] 
     } 
    } 
} 

由于Jansson未能说明它不是数组(确切的错误是“错误:root不是数组”)。 不知道如何处理这个。我应该以某种方式解析出“数据”之后的东西:然后找出正确地停止或有更好的方法。

谢谢!

+0

你有可能从[Jannson教程](https://github.com/akheron/jansson/blob/master/doc/tutorial.rst)复制粘贴了一些代码?该示例适用于Json数组(与第一个片段一样;用方括号表示)。然而,Facebook的回应只是一个单一的对象。它在层次结构的某个点包含一个数组('data'),但您需要首先解析顶层的东西才能到达那里。基本上你现在试图将一个单一的对象映射到一个数组上 - 这也是错误所在。 – 2013-03-24 18:18:40

+0

是的,我从Jannson教程中取出代码,然后修改它来提取整数。该教程只抓取字符串。所以我想我需要弄清楚如何在“data:[...]”之后抓取这些东西,并确保我停在正确的支架上。反正谢谢你的回复! – kub 2013-03-24 18:33:15

+0

不是Facebook的专家,但对于特定的调用/响应将字符串分隔符设置为等于“]”和“[”来提取数据是安全的。这太危险了吗? – kub 2013-03-24 22:50:46

回答

1

你需要做的是修改解析逻辑,首先处理包装你感兴趣的data数组的Json对象。虽然这需要一些额外的编程,但它肯定会击败任何字符串操作尝试。除非你100%肯定“[”和“]”将始终是回应的一部分,否则我不会对你收到的内容做任何假设。

我对Jannson并不熟悉,但在处理data阵列之前,您还需要做其他一些小工作。刚刚从看教程,它或许应该看起来有点像这样:

// make request 
text = request(url); 
// decode json 
root = json_loads(text, 0, &error); 

// parse "Response" 
json_t *response = json_object_get(root, "Response"); 
json_t *responseCode = json_object_get(response, "responseCode"); 
int responseCodeValue = json_integer_value(responseCode); 

// parse "graphObject" 
json_t *graphObject = json_object_get(root, "graphObject"); 
json_t *graphObjectClass = json_object_get(graphObject, "graphObjectClass"); 
json_t *state = json_object_get(graphObject, "state"); 
json_t *data = json_object_get(state, "data"); 

// iterate over the "data" array, parse the key/values etc. 
for(i = 0; i < json_array_size(data); i++) { 
    json_t *data = json_array_get(root, i); 
} 

对于这个例子起见,我省略了所有的类型检查(你将要添加这些你自己),以及任何清洁内存/变量的增加。另外,请小心任何错别字和/或明显的错误,因为我只是直接在浏览器中输入这些内容,而没有进行任何编译或运行时检查。我相信你可以自己过滤出来。

我很好奇的一件事是为什么你选择了Jannson?我猜是因为它支持Android和iOS?如果您专门针对Android,那么还有很多其他选项。例如,基本的Json支持是built into the Android framework,但也有第三方库可以将Json映射到Java对象,如GSONJackson

+0

MH--感谢您的回复,我帮了我很大的忙! – kub 2013-03-25 14:17:59