0

长话短说,我有一个 android 应用程序,我使用 cocos2dx 来开发它。我正在研究的一个组件是将我的 facebook 朋友带入我的游戏。我这样做的方式是在本机端(java)我设置了我的 facebook sdk。我成功登录并毫无问题地拉下我的朋友列表。我的问题是我需要将此数据转发到 c++ 端,以便我可以访问数据并将其带入标签等。

在这里,我猜想一些事情是如何发生的结构:Java native - 开始活动,登录到 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 无法说明它不是数组(确切的错误是“错误:根不是数组”)。不知道如何处理。我应该以某种方式解析“数据”之后的内容:然后找出正确停止的位置还是有更好的方法。

谢谢!!

4

1 回答 1

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);
}

为了这个例子,我省略了所有类型检查(你会想自己添加)以及任何内存/变量的清理。另外,请注意任何拼写错误和/或明显的错误,因为我只是直接在浏览器中输入了这个,并没有进行任何编译或运行时检查。我相信你可以自己过滤掉这些。

我很好奇的一件事是你为什么选择詹森?我猜是因为它同时支持Android和iOS?如果您专门针对 Android,还有很多其他选择。例如,Android 框架中内置了基本的 Json 支持,但也有第三方库可以将 Json 映射到 Java 对象,如GSONJackson

于 2013-03-25T00:18:02.283 回答