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

How to handle my JSON string from Google Sheets API v4 in Java

我是 Google 表格的新手 API,我似乎无法取得任何进展。

我有一个 Google 电子表格,我正在使用 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"
    ]
]
}

现在我的问题是我找不到如何处理我的数据。我习惯于使用键(例如 "school":"conjuration")读取 JSON 数据,所以我可以使用以下内容:

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..
    }
}

您还可以为 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") 获取值。

这些是您的数据的路径:

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。而且主持人还挺逗的。