如何在Java中处理Google Sheets API v4中的JSON字符串

如何在Java中处理Google Sheets API v4中的JSON字符串,java,android,google-sheets,google-spreadsheet-api,Java,Android,Google Sheets,Google Spreadsheet Api,我对GoogleSheetsAPI还不熟悉,似乎我不能取得任何进展 我有一个谷歌电子表格,我使用API和这个URL来获取JSON数据: https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId/values/01Jul2017!A1:T?key=APIkey 这最终会给我这样的东西: { "range": "'01Jul2017'!A1:T2828", "majorDimension": "ROWS", "values"

我对GoogleSheetsAPI还不熟悉,似乎我不能取得任何进展

我有一个谷歌电子表格,我使用API和这个URL来获取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数据(例如“school”:“concuration”),因此我可以使用以下命令:

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

有人能帮我解决问题吗?或者只是把我引向正确的方向?

您可以将JSON字符串转换为JSON树,然后遍历所有节点并设置值。如何将其转换为树取决于您使用的Json库。下面是一个使用Jackson 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..
    }
}
您还可以对
字段使用自定义反序列化程序,这样您就不必处理所有JSON,但反序列化程序只需执行与上面相同的操作

编辑

如果您可以假设第一个具有
名称
学校
等的数组始终是第一个数组,并且总是按正确的顺序排列,那么您可以执行以下操作

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);
}
ObjectMapper mapper=new ObjectMapper();
JsonNode jsonTree=mapper.readTree(json);
ArrayNode值数组=(ArrayNode)jsonTree.get(“值”);
列表拼写=新建ArrayList();
Map-spellMap=null;
对于(int i=1;i

然后,您可以在每个地图上使用
.get(“name”)
.get(“school”)
迭代列表并获取值。

以下是数据的路径:

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');
} 
函数getJSON(文件名) { var txt=myUtilities.loadFile(文件名); var data=JSON.parse(txt); 返回数据; } 函数tstJSON() { var nl=''; var html=''; var data=getJSON('jsonTesting.json'); html+=Utilities.formatString('data.range=%s
data.majorDimension=%s',data.range,data.majorDimension);
for(var i=0;我想知道你的答案!我仍在试图弄清楚如何像上面那样将字符串(名称、学校等)放入拼写对象中。我会在发现后进行更新。我找到了一种方法,通过首先转换为如下数组将数据映射到我的对象:
List spellData=new ObjectMapper().readValue(valuesItemArray.traverse()),new TypeReference(){});
我不确定这是不是正确的方法,但它是有效的!:)@Zenokin哦,好的。我不知道第一个数组是列,其余的是值,但我已经用一种方法更新了我的答案,你可以解析它,并得到所有拼写的列表,以及列名到列值的映射。对不起,应该说得更清楚一点!非常感谢你的帮助,我接受你的答案作为解决方案:)谢谢你的投入和教育视频!我最终使用了tima提供的解决方案。