JAVA parser for asana json data "Error:JSONObject cannot be converted to JSONArray"

JAVA parser for asana json data "Error:JSONObject cannot be converted to JSONArray"

我正在研究 java 解析体式 json 数据的解析器。现在我正在执行 使用 curl 请求和 curl 使用 cygwin 工具(用于在 windows 上执行 UNIX 命令)。

现在我正在获取 json 格式的单个项目详细信息(包含项目中的所有任务),我从中获取一个任务 ID 并使用此任务 ID 获取单个任务详细信息。但是当我解析子请求数据时(请求获取单个任务详细信息)。它给我错误 “JSON对象无法转换为JSON数组”。

错误行是

JSON数组dataArray2= (JSON数组)jsonObject2.get("data");

Asana 示例 JSON 响应许多任务

{
  "data": [
    {
      "id": 23097910271884,
      "name": "Asana Prtl Rprtng Intgrtn R&D"
    },
    {
      "id": 30483134480109,
      "name": "Curl Training"
    },
    {
      "id": 30483134480115,
      "name": "Database Design"
    },
    {
      "id": 31806291283828,
      "name": "JSON Parser Setup"
        },
    {
      "id": 31806291283832,
      "name": "JDB Connectivity and Setup"
    },
    {
      "id": 30483134480118,
      "name": "Java Utility Development"
    },
    {
      "id": 31806291283837,
      "name": "Data Synchronization Testing"
    },
    {
      "id": 31806291283841,
      "name": "Bug Fixes"
    },
    {
      "id": 30483134480171,
      "name": "Portal Test Report Development (1)"
    }
  ]
}

Asana 单任务详细信息示例

{
  "data": {
    "id": 23097910271884,
    "created_at": "2014-12-30T06:35:11.959Z",
    "modified_at": "2015-05-12T07:19:02.589Z",
    "name": "Asana Prtl Rprtng Intgrtn R&D",
    "notes": "",
    "completed": true,
    "assignee_status": "inbox",
    "completed_at": "2015-05-12T07:20:29.181Z",
    "due_on": "2015-04-01",
    "due_at": null,
    "workspace": {
      "id": 14810798216415,
      "name": "crescentbahuman.com"
    },
    "num_hearts":2,
    "parent": null,
    "tags": [
    {
        "id": 17129100409445,
        "name": "IT"
      }
    ],
    "projects": [
      {
        "id": 30483134480107,
        "name": "Asana Integrations"
      }
    ],
    "hearted": true,
    "memberships": [
      {
        "project": {
          "id": 30483134480107,
          "name": "Asana Integrations"
        },
        "section": null
      }
    ],
    "assignee": {
      "id": 22273357407644,
      "name": "Abdul Majid bajwa"
    },
    "hearts": [
      {
        "id": 33739876272211,
        "user": {
          "id": 22273357407644,
          "name": "Abdul Majid bajwa"
        }
      },
      {
        "id": 33740502736864,
        "user": {
          "id": 14810783571926,
          "name": "Asana Admin"
        }
      }
    ],
    "followers": [
      {
        "id": 14810783571926,
        "name": "Asana Admin"
      },
      {
        "id": 22273357407644,
        "name": "Abdul Majid bajwa"
      }
    ]
  }
}

示例Java代码

package AllJsonClasses;


import java.io.*;
import java.lang.*;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

public class asanaData {

public static void main (String args[]){
File workDir = new File("C:/cygwin64/bin");
try {
Runtime systemShell = Runtime.getRuntime();
String urlRequest="curl -u 6k8mJNVi.o6S1DQBGT1AIESl4KQsqb0G:   https://app.asana.com/api/1.0/projects/30483134480107/tasks?opt_pretty";

String cmd = urlRequest;
cmd += " | grep 'OBJECT'"; 
Process shellOutput = systemShell.exec(workDir+"/"+cmd, null, workDir);
InputStreamReader isr = new InputStreamReader(shellOutput.getInputStream());    
BufferedReader br = new BufferedReader (isr);


        JSONParser jsonParser = new JSONParser();
        JSONObject jsonObject = (JSONObject) jsonParser.parse(br);


        JSONArray dataArray= (JSONArray) jsonObject.get("data");
        for(int i=0;i<dataArray.size();i++){         
        JSONObject dataObject = (JSONObject) dataArray.get(i);



        long task_id =  (long) dataObject.get("id");
        System.out.println("project id is: " + task_id);

        try {
        File workDir2 = new File("C:/cygwin64/bin");
        Runtime systemShell2 = Runtime.getRuntime();
        String curlRequest2="curl -u 6k8mJNVi.o6S1DQBGT1AIESl4KQsqb0G: https://app.asana.com/api/1.0/tasks/"+task_id+"?opt_pretty";
        System.out.println();


        String cmd2 = curlRequest2;
        cmd2 += " | grep 'OBJECT'"; 
        Process shellOutput2 = systemShell2.exec(workDir2+"/"+cmd2, null, workDir2);
        InputStreamReader isr2 = new InputStreamReader(shellOutput2.getInputStream());  
        BufferedReader br2 = new BufferedReader (isr2);
        JSONParser jsonParser2 = new JSONParser();
        JSONObject jsonObject2 = (JSONObject) jsonParser2.parse(br2);



        JSONArray dataArray2= (JSONArray)jsonObject2.get("data");
        for(int i2=0;i<dataArray2.size();i2++){         
        JSONObject dataObject2 = (JSONObject) dataArray2.get(i2);



        long task_id2 =  (long) dataObject2.get("id");
        System.out.println("Task id is: " + task_id2);

        String task_created_at_dt2 = (String) dataObject2.get("created_at");
        System.out.println("The task created at is: " + task_created_at_dt2);

        String task_modified_at_dt2 = (String) dataObject2.get("modified_at");
        System.out.println("The task modified at is: " + task_modified_at_dt2);


        String task_name = (String) dataObject2.get("name");
        System.out.println("Task name is: " + task_name);

        String task_notes = (String) dataObject2.get("notes");
        System.out.println("Task Notes are: " + task_notes);

        boolean task_completed_status = (boolean) dataObject2.get("completed");
        System.out.println("Task Completed status: " + task_completed_status);

        String task_assignee_status = (String) dataObject2.get("assignee_status");
        System.out.println("Task Assignee status: " + task_assignee_status);

        String completed_at = (String) dataObject2.get("completed_at");
        System.out.println("Task Completed at: " + completed_at);

        String task_due_on = (String) dataObject2.get("due_on");
        System.out.println("Task due date: " + task_due_on);

        String due_at = (String) dataObject2.get("due_at");
        System.out.println("Task due at: " + due_at);

        JSONObject workspaceObj = (JSONObject) dataObject2.get("workspace");
        Long workspace_id = (Long) workspaceObj.get("id");
        String workspace_name = (String) workspaceObj.get("name");
        System.out.println("Workspace id " + workspace_id + " with workspace  name " + workspace_name);

        long task_number_of_hearts = (long) dataObject2.get("num_hearts");
        System.out.println("Task number of hearts: " + task_number_of_hearts);

        String task_parent = (String) dataObject2.get("parent");
        System.out.println("Task parent: " + task_parent);

        JSONArray task_hearts= (JSONArray) dataObject2.get("hearts");
        for (int z = 0; z < task_hearts.size(); z++) {
        JSONObject task_hearts_object = (JSONObject) task_hearts.get(z);
        Long task_hearts_id = (Long) task_hearts_object.get("id");
        String task_hearts_name = (String) task_hearts_object.get("name");
        System.out.println("Task hearts id " + task_hearts_id + " with Task hearts name " + task_hearts_name);
        }

        JSONArray task_tags= (JSONArray) dataObject2.get("tags");
            for (int z = 0; z < task_tags.size(); z++) {
                JSONObject task_tags_object = (JSONObject) task_tags.get(z);
                Long task_tags_id = (Long) task_tags_object.get("id");
                String task_tags_name = (String) task_tags_object.get("name");
                System.out.println("Task tags id " + task_tags_id + " with Task tags name " + task_tags_name);
            }

        boolean task_hearted = (boolean) dataObject2.get("hearted");
        System.out.println("Task hearted: " + task_hearted);

        JSONArray task_projects= (JSONArray) dataObject2.get("projects");
        for (int z = 0; z < task_projects.size(); z++) {
        JSONObject task_projects_object = (JSONObject) task_projects.get(z);
        Long task_projects_id = (Long) task_projects_object.get("id");
        String task_projects_name = (String) task_projects_object.get("name");
        System.out.println("Task projects id " + task_projects_id + " with Task projects name " + task_projects_name);
        }

        JSONArray task_memberships= (JSONArray) dataObject2.get("memberships");
        for (int z = 0; z < task_memberships.size(); z++) {
        JSONObject task_memberships_object = (JSONObject) task_memberships.get(z);
        JSONObject task_memberships_section_object = (JSONObject) task_memberships_object.get("section");
        if(task_memberships_section_object!=null){
        Long task_memberships_section_id = (Long) task_memberships_section_object.get("id");
        String task_memberships_section_name = (String) task_memberships_section_object.get("name");
        System.out.println("Task memberships Section id " + task_memberships_section_id + " with Task memberships Section name " + task_memberships_section_name);
        }

        JSONObject task_memberships_project = (JSONObject) task_memberships_object.get("project");
        Long task_memberships_project_id = (Long) task_memberships_project.get("id");
        String task_memberships_project_name = (String) task_memberships_project.get("name");
        System.out.println("Task memberships project id " + task_memberships_project_id + " with Task memberships project name " + task_memberships_project_name);
        }

        JSONObject task_assignee_object = (JSONObject) dataObject2.get("assignee");
        if(task_assignee_object!=null){
        Long task_assignee_id = (Long) task_assignee_object.get("id");
        String task_assignee_name = (String) task_assignee_object.get("name");
        System.out.println("assignee id " + task_assignee_id + " with assignee name " + task_assignee_name);
        }

        JSONArray task_followers= (JSONArray) dataObject2.get("followers");
        for (int z = 0; z < task_followers.size(); z++) {
        JSONObject task_followers_object = (JSONObject) task_followers.get(z);
        Long task_followers_id = (Long) task_followers_object.get("id");
        String task_followers_name = (String) task_followers_object.get("name");
        System.out.println("followers id " + task_followers_id + " with followers name " + task_followers_name);
        } 

        JSONArray task_subtasks= (JSONArray) dataObject2.get("subtasks");
        for(int j=0;j<task_subtasks.size();j++){ 
        JSONObject sub_data_object = (JSONObject) task_subtasks.get(j);
        //JSONObject innerObj = (JSONObject) m.get("project"); 

        long sub_task_id =  (long) sub_data_object.get("id");
        System.out.println("Subtasks id is: " + sub_task_id);          

        String sub_task_name = (String) sub_data_object.get("name");
        System.out.println("Subtasks task name is: " + sub_task_name);




        String sub_task_notes = (String) sub_data_object.get("notes");
        System.out.println("Subtasks notes are: " + sub_task_notes);


        boolean sub_task_completed_status = (boolean) sub_data_object.get("completed");
        System.out.println("Subtasks completed status: " + sub_task_completed_status);

        String sub_task_assignee_status = (String) sub_data_object.get("assignee_status");
        System.out.println("Subtasks assignee status: " + sub_task_assignee_status);

        String sub_completed_at = (String) sub_data_object.get("completed_at");
        System.out.println("Subtasks completed at: " + sub_completed_at);

        String sub_task_due_on = (String) sub_data_object.get("due_on");
        System.out.println("Subtasks due on: " + sub_task_due_on);

        String sub_due_at = (String) sub_data_object.get("due_at");
        System.out.println("Subtasks due at: " + sub_due_at);

        JSONObject sub_workspace_object = (JSONObject) sub_data_object.get("workspace");
        Long sub_workspace_id = (Long) sub_workspace_object.get("id");
        String sub_workspace_name = (String) sub_workspace_object.get("name");
        System.out.println("Subtasks workspace id " + sub_workspace_id + " with subtasks workspace name " + sub_workspace_name);


        long sub_task_number_of_hearts = (long) sub_data_object.get("num_hearts");
        System.out.println("Subtasks number of hearts: " + sub_task_number_of_hearts);


        JSONObject sub_parent_object = (JSONObject) sub_data_object.get("parent");
        Long sub_parent_id = (Long) sub_parent_object.get("id");
        String sub_parent_name = (String) sub_parent_object.get("name");
        System.out.println("Subtasks parent id " + sub_parent_id + " with Subtasks parent name " + sub_parent_name);



        JSONArray sub_hearts= (JSONArray) sub_data_object.get("hearts");
        for (int z = 0; z < sub_hearts.size(); z++) {
        JSONObject sub_hearts_object = (JSONObject) sub_hearts.get(z);
        Long sub_hearts_id = (Long) sub_hearts_object.get("id");
        String sub_hearts_name = (String) sub_hearts_object.get("name");
        System.out.println("Subtasks hearts id " + sub_hearts_id + "with Subtasks  hearts name " + sub_hearts_name);
        }

        JSONArray sub_tags= (JSONArray) sub_data_object.get("tags");
        for (int z = 0; z < sub_tags.size(); z++) {
        JSONObject sub_tags_object = (JSONObject) sub_tags.get(z);
        Long sub_tags_id = (Long) sub_tags_object.get("id");
        String sub_tags_name = (String) sub_tags_object.get("name");
        System.out.println("Subtasks tags id " + sub_tags_id + " with Subtasks tags name " + sub_tags_name);
        }

        boolean sub_task_hearted = (boolean) sub_data_object.get("hearted");
        System.out.println("Subtasks hearted: " + sub_task_hearted);

        JSONArray sub_projects= (JSONArray) sub_data_object.get("projects");
        for (int z = 0; z < sub_projects.size(); z++) {
        JSONObject sub_projects_object = (JSONObject) sub_projects.get(z);
        Long sub_projects_id = (Long) sub_projects_object.get("id");
        String sub_projects_name = (String) sub_projects_object.get("name");
        System.out.println("Subtasks projects id " + sub_projects_id + " with Subtasks projects name " + sub_projects_name);
        }

        JSONArray sub_memberships= (JSONArray) sub_data_object.get("memberships");
        if(sub_memberships!=null){
         for (int z = 0; z < sub_memberships.size(); z++) {
        JSONObject sub_memberships_object = (JSONObject) sub_memberships.get(z);

        JSONObject sub_memberships_section_object = (JSONObject) sub_memberships_object.get("section");
        Long sub_memberships_section_id = (Long) sub_memberships_section_object.get("id");
        String sub_memberships_section_name = (String) sub_memberships_section_object.get("name");
        System.out.println("Subtasks memberships section id " + sub_memberships_section_id + " with Subtasks memberships section name " + sub_memberships_section_name);

        JSONObject sub_memberships_project_object = (JSONObject) sub_memberships_object.get("project");
        Long sub_memberships_project_id = (Long) sub_memberships_project_object.get("id");
        String sub_memberships_project_name = (String) sub_memberships_project_object.get("name");
        System.out.println("Subtasks memberships project id " + sub_memberships_project_id + " with Subtasks memberships project name " + sub_memberships_project_name);
        }
        } 

        JSONObject sub_assignee_object = (JSONObject) sub_data_object.get("assignee");
         if(sub_assignee_object!=null){
        Long sub_assignee_id = (Long) sub_assignee_object.get("id");
        String sub_assignee_name = (String) sub_assignee_object.get("name");
        System.out.println("Subtasks assignee id " + sub_assignee_id + " with Subtasks assignee name " + sub_assignee_name);
         }

        JSONArray sub_followers= (JSONArray) sub_data_object.get("followers");
        for (int z = 0; z < sub_followers.size(); z++) {
        JSONObject sub_followers_object = (JSONObject) sub_followers.get(z);
        Long sub_followers_id = (Long) sub_followers_object.get("id");
        String sub_followers_name = (String) sub_followers_object.get("name");
        System.out.println("Subtasks followers id " + sub_followers_id + " with Subtasks followers name " + sub_followers_name);

        }}}
        }catch (IOException ioe){
System.err.println(ioe);
}catch (Throwable t) {
t.printStackTrace();
}     
        String task_name = (String) dataObject.get("name");
        System.out.println("project name is: " + task_name);

        }


int exitVal = shellOutput.waitFor();
System.out.println("Process Exit Value : "+exitVal);
}catch (IOException ioe){
System.err.println(ioe);
}catch (Throwable t) {
t.printStackTrace();
}
}
}

根据 docs 你必须使用 getJSONArray() 方法而不是简单的 get():

JSONArray dataArray2 = jsonObject2.getJSONArray("data");

希望能解决您的错误。

你应该在投射之前添加一些主动检查。

喜欢:

Object dataArray2 =  jsonObject2.get("data");
if(dataArray2 instanceof JSONArray){
JSONArray jsonArray=(JSONArray)dataArray2;
}
else if(dataArray2 instanceof JSONObject){
JSONObject jsonObject3=(JSONObject)dataArray2;
}