2017-07-25 29 views
2

我不熟悉Google Sheets API,看起來我無法取得任何進展。如何從Java中的Google Sheets API v4處理我的JSON字符串

我有一個谷歌電子表格和我使用這個網址的API來獲取JSON數據:

https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId/values/01Jul2017!A1:T?key=APIkey 

這將最終給我這樣的:

{ 
    "range": "'01Jul2017'!A1:T2828", 
    "majorDimension": "ROWS", 
    "values": [ 
    [ 
     "name", 
     "school", 
     "subschool", 
     "descriptor" 
    ], 
    [ 
     "Acid Arrow", 
     "conjuration", 
     "creation", 
     "acid" 
    ], 
    [ 
     "Air Walk", 
     "transmutation", 
     "", 
     "air" 
    ] 
] 
} 

現在我的問題是我無法找到如何處理我的數據。我已經習慣了閱讀JSON數據和密鑰(例如「學校」:「咒語」),這樣我就可以使用以下方法:

spell.setSchool(jsonObjectSpell.getString("school")); 

誰能幫我出,或只是把我在正確的方向?

回答

0

您可以將JSON字符串轉換爲JSON樹,然後遍歷所有節點並設置您的值。如何將其轉換爲樹取決於您使用的Json庫。下面是一個使用傑克遜2

ObjectMapper mapper = new ObjectMapper(); 
JsonNode jsonTree = mapper.readTree(json); 

JsonNode valuesArray = jsonTree.get("values"); 

// each array in values 
for (JsonNode valuesItemArray : valuesArray) { 
    // each sub-array 
    for (JsonNode valuesItem : valuesItemArray) { 
     // valuesItem is name, school, etc.. 
    } 
} 

您也可以使用的values字段的自定義解串器,使您不必處理所有的JSON的例子,但解串器將只是做同樣的事情,以上。

編輯

如果你可以假設與nameschool等第一陣列永遠是第一,永遠是正確的順序,那麼你可以這樣做以下。

ObjectMapper mapper = new ObjectMapper(); 
JsonNode jsonTree = mapper.readTree(json); 

ArrayNode valuesArray = (ArrayNode) jsonTree.get("values"); 

List<Map<String, String>> spells = new ArrayList<Map<String, String>>(); 
Map<String, String> spellMap = null; 

for (int i = 1; i < valuesArray.size(); i++) { 
    ArrayNode valuesItemArray = (ArrayNode) valuesArray.get(i); 

    spellMap = new HashMap<String, String>(); 
    spellMap.put("name", valuesItemArray.get(0).asText()); 
    spellMap.put("school", valuesItemArray.get(1).asText()); 
    spellMap.put("subschool", valuesItemArray.get(2).asText()); 
    spellMap.put("descriptor", valuesItemArray.get(3).asText()); 

    spells.add(spellMap); 
} 

然後你可以遍歷列表,並通過每個地圖上使用.get("name").get("school")獲得的價值。

+0

感謝您的回答!我仍然試圖弄清楚如何將字符串(姓名,學校等)放入Spell對象,就像我上面所做的那樣。當我發現時我會更新。 – Zenokin

+1

我發現了一種將數據映射到我的對象的方法,首先轉換爲一個數組,如下所示:'List spellData = new ObjectMapper()。readValue(valuesItemArray.traverse(),new TypeReference >(){}) ;' 我不確定這是否是正確的方式,但它的工作原理! :) – Zenokin

+0

@Zenokin哦,好的。我不明白,第一個數組是列,其餘的是值,但我用一種方法更新了我的答案,您可以解析它,並獲得列名與列值映射的所有法術列表。 – tima

0

這些是路徑數據:

data.range='01Jul2017'!A1:T2828 
data.majorDimension=ROWS 
data.values[0][0]=name 
data.values[0][1]=school 
data.values[0][2]=subschool 
data.values[0][3]=descriptor 
data.values[1][0]=Acid Arrow 
data.values[1][1]=conjuration 
data.values[1][2]=creation 
data.values[1][3]=acid 
data.values[2][0]=Air Walk 
data.values[2][1]=transmutation 
data.values[2][2]= 
data.values[2][3]=air 

這是我用於產生上面的代碼:

function getJSON(fileName) 
{ 
    var txt=myUtilities.loadFile(fileName); 
    var data=JSON.parse(txt); 
    return data; 
} 

function tstJSON() 
{ 
    var nl=''; 
    var html=''; 
    var data=getJSON('jsonTesting.json'); 
    html+=Utilities.formatString('data.range=%s<br />data.majorDimension=%s',data.range,data.majorDimension); 
    for(var i=0;i<3;i++) 
    { 
    for(var j=0;j<4;j++) 
    { 

     html+= '<br />data.values[' + i + '][' + j + ']=' + data.values[i][j]; 

    } 
    } 
    var userInterface=HtmlService.createHtmlOutput(html); 
    SpreadsheetApp.getUi().showModelessDialog(userInterface, 'testJSON'); 
} 

This video is worth watching。主持人頗具娛樂性。

+0

感謝您的意見和教育視頻!我最終使用了tima提供的解決方案。 – Zenokin

相關問題