如何在Java中处理Google Sheets API v4中的JSON字符串
我对GoogleSheetsAPI还不熟悉,似乎我不能取得任何进展 我有一个谷歌电子表格,我使用API和这个URL来获取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"
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提供的解决方案。