长话短说,我有一个android应用程序,我使用cocos2dx来开发它。我正在努力将facebook好友引入游戏中。我的做法是在原生端(java)设置facebook sdk。我成功登录并拉下我的好友列表,没有任何问题。我的问题是,我需要将这些数据转发到c++端,这样我就可以访问数据并将其带入标签等。
我猜这是事情发生的一些结构:Java native - start activity, login to facebook, get friends -> STRING DATA JNI to c++ -> CPP parse JSON DATA with Jannson.
我的问题是,如果我有一个这样的样本数据:
[
{
"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失败说明它不是一个数组(确切的错误是"error: root不是一个数组")。不知道该怎么处理。我是否应该以某种方式解析出"data"之后的东西:然后找出正确停止的地方,或者有更好的方法。
谢谢! !
您需要做的是修改解析逻辑,首先处理包装您感兴趣的data
数组的Json对象。虽然这将需要一些额外的编程,但它绝对胜过任何String操作尝试。除非你100%确定"["one_answers"]"总是回复的一部分,否则我不会对你收到的内容做任何假设。
我不熟悉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);
}
为了这个示例,我省略了所有类型检查(您将需要自己添加这些检查)以及任何内存/变量的清理。此外,请注意任何拼写错误和/或明显的错误,因为我只是直接在浏览器中键入此内容,并没有进行任何编译或运行时检查。我相信你能自己把它们过滤出来。
我很好奇的一件事是你为什么选择了詹森?我猜是因为它同时支持Android和iOS?如果你的目标是Android,那么还有很多其他选择。例如,基本的Json支持是内置在Android框架中,但也有第三方库将Json映射到Java对象,如GSON和Jackson。