【问题标题】:How to handle my JSON string from Google Sheets API v4 in Java如何在 Java 中处理来自 Google Sheets API v4 的 JSON 字符串
【发布时间】:2017-07-25 16:19:39
【问题描述】:

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

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

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

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

任何人都可以帮助我或让我朝着正确的方向前进吗?

【问题讨论】:

    标签: java android google-sheets google-spreadsheet-api


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答!我仍在试图弄清楚如何将字符串(姓名、学校等)放入 Spell 对象中,就像我在上面所做的那样。当我发现时会更新。
    • 我找到了一种将数据映射到我的对象的方法,方法是首先转换为如下所示的数组:List&lt;String&gt; spellData = new ObjectMapper().readValue(valuesItemArray.traverse(), new TypeReference&lt;ArrayList&lt;String&gt;&gt;(){}); 我不确定这是否正确,但它有效! :)
    • @Zenokin 哦,好的。我不明白第一个数组是列,其余的是值,但我已经用一种方法更新了我的答案,你可以解析它并获取所有拼写的列表,其中包含列名到列值的映射。
    • 对不起,应该更清楚一点!非常感谢您的帮助,我接受您的回答作为解决方案:)
    【解决方案2】:

    这些是您的数据的路径:

    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。而且主播很有趣。

    【讨论】:

    • 感谢您的意见和教育视频!我最终使用了 tima 提供的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 2017-07-16
    相关资源
    最近更新 更多