2013-03-24 107 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