billz
billz

Reputation: 1509

How to read json file into java with simple JSON library

I want to read this JSON file with java using json simple library.

My JSON file looks like this:

[  
    {  
        "name":"John",
        "city":"Berlin",
        "cars":[  
            "audi",
            "bmw"
        ],
        "job":"Teacher"
    },
    {  
        "name":"Mark",
        "city":"Oslo",
        "cars":[  
            "VW",
            "Toyata"
        ],
        "job":"Doctor"
    }
]

This is the java code I wrote to read this file:

package javaapplication1;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JavaApplication1 {
    public static void main(String[] args) {

        JSONParser parser = new JSONParser();

        try {     
            Object obj = parser.parse(new FileReader("c:\\file.json"));

            JSONObject jsonObject =  (JSONObject) obj;

            String name = (String) jsonObject.get("name");
            System.out.println(name);

            String city = (String) jsonObject.get("city");
            System.out.println(city);

            String job = (String) jsonObject.get("job");
            System.out.println(job);

            // loop array
            JSONArray cars = (JSONArray) jsonObject.get("cars");
            Iterator<String> iterator = cars.iterator();
            while (iterator.hasNext()) {
             System.out.println(iterator.next());
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

But I get the following exception:

Exception in thread "main" java.lang.ClassCastException: org.json.simple.JSONArray cannot be cast to org.json.simple.JSONObject at javaapplication1.JavaApplication1.main(JavaApplication1.java:24)

Can somebody tell me what I am doing wrong? The whole file is a array and there are objects and another array (cars) in the whole array of the file. But i dont know how I can parse the whole array into a java array. I hope somebody can help me with a code line which I am missing in my code.

Thanks

Upvotes: 150

Views: 1008216

Answers (24)

M. Muhammadsodiq
M. Muhammadsodiq

Reputation: 155

Here is one way to read json file and parse it into the list of objects

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;


private List<Student> readFromJsonFile(String fileName) throws IOException {
    Resource resource = resourceLoader.getResource("classpath:" + fileName);

    try (BufferedReader reader = new BufferedReader(
            new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8))) {
        
        Type listType = new TypeToken<List<Student>>() {
        }.getType();
        return new Gson().fromJson(reader, listType);
    }
}

The "classpath:" means the resources folder in the spring boot project. Based on your condition you can modify it.

Upvotes: 0

ckarosta
ckarosta

Reputation: 1

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME,property = "type")
@JsonSubTypes({
        @JsonSubTypes.Type(value = Dog.class,name = "Dog"),
        @JsonSubTypes.Type(value=Bagamol.class,name="Bagamol")

Upvotes: 0

Kishan Kumar
Kishan Kumar

Reputation: 9

Add Jackson dependency to use ObjectMapper in your pom.xml file.

 <dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-databind</artifactId>
   <version>2.12.3</version>
 </dependency>

In your main class App.java, use the mapper to convert your JSON file to JsonNode

public static void main(Strings[] args) {

    ObjectMapper mapper = new ObjectMapper();
    JsonNode json = mapper.readValue(new File("/path/to/file"), JsonNode.class);
    json.fields()
            .forEachRemaining((field) -> {
                String key = field.getKey();
                JsonNode value = field.getValue(); // value can be yet another JSON
               // Do your stuff with the keys and values here.
            });


}

Upvotes: 0

Sanjay singh
Sanjay singh

Reputation: 9

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
public class JsonParserTest {
    public static void main(String[] args) throws IOException {
        String data = new String(Files.readAllBytes(Paths.get("C:/json.txt"))); 
        JsonElement jsonElement = JsonParser.parseString(data);
        JsonObject json = jsonElement.getAsJsonObject();
        System.out.println(json.get("userId"));
        System.out.println(json.get("id"));
        System.out.println(json.get("title"));
        System.out.println(json.get("completed"));
    }
}

Use the below repositay from GSON.
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.6</version>
</dependency>

Upvotes: 1

user19680274
user19680274

Reputation:

  try {
      //Object obj = parser.parse(new FileReader("C:/Local Disk/file.json"));
      
       // create object mapper instance
        ObjectMapper mapper = new ObjectMapper();

        // convert JSON string to Book object
        Object obj = mapper.readValue(Paths.get("C:/Local Disk/file.json").toFile(), Object.class);

        // print book
        System.out.println(obj);

        String jsonInString = new Gson().toJson(obj);
        JSONObject mJSONObject = new JSONObject(jsonInString);
        
        System.out.println("value::::" + mJSONObject);  
      
      JSONObject orchestration = (JSONObject) mJSONObject.get("orchestration");
     

      JSONObject trigger = (JSONObject) orchestration.get("trigger-definition");
     

      JSONObject schedule = (JSONObject) trigger.get("schedule");
    
       JSONObject trade = (JSONObject) schedule.get("trade-query");
    
     // loop array
      JSONArray filter = (JSONArray) trade.get("filter");
   
  
      for (Object o : filter) {
          JSONObject person = (JSONObject) o;

          String strName = (String) person.get("name");
          System.out.println("Name::::" + strName);

          String operand = (String) person.get("operand");
          System.out.println("City::::" + operand);

          String value = (String) person.get("value");
          System.out.println("value::::" + value);
      }
     
      JSONArray parameter = (JSONArray) trade.get("parameter");
      for (Object o : parameter) {
          JSONObject person = (JSONObject) o;

          String strName = (String) person.get("name");
          System.out.println("Name::::" + strName);

          String value = (String) person.get("value");
          System.out.println("value::::" + value);
      }


  } catch (FileNotFoundException e) {
      e.printStackTrace();
  } catch (IOException e) {
      e.printStackTrace();
  }
  
  

  

Upvotes: 0

user19680274
user19680274

Reputation:

  try {
      Object obj = parser.parse(new FileReader("C:/Local Disk/file.json"));

     // JSONArray array = (JSONArray) obj;
      JSONObject jsonObject = (JSONObject) obj;
      
      JSONObject orchestration = (JSONObject) jsonObject.get("orchestration");
     

      JSONObject trigger = (JSONObject) orchestration.get("trigger-definition");
     

      JSONObject schedule = (JSONObject) trigger.get("schedule");
    
       JSONObject trade = (JSONObject) schedule.get("trade-query");
    
     // loop array
      JSONArray filter = (JSONArray) trade.get("filter");
   
  
      for (Object o : filter) {
          JSONObject person = (JSONObject) o;

          String strName = (String) person.get("name");
          System.out.println("Name::::" + strName);

          String operand = (String) person.get("operand");
          System.out.println("City::::" + operand);

          String value = (String) person.get("value");
          System.out.println("value::::" + value);
      }
     
      JSONArray parameter = (JSONArray) trade.get("parameter");
      for (Object o : parameter) {
          JSONObject person = (JSONObject) o;

          String strName = (String) person.get("name");
          System.out.println("Name::::" + strName);

          String value = (String) person.get("value");
          System.out.println("value::::" + value);
      }


  } catch (FileNotFoundException e) {
      e.printStackTrace();
  } catch (IOException e) {
      e.printStackTrace();
  } catch (ParseException e) {
      e.printStackTrace();
  }

}

Upvotes: 0

Bipin Kumar Chaurasia
Bipin Kumar Chaurasia

Reputation: 418

Following is the working solution to your problem statement as,

File file = new File("json-file.json");
    JSONParser parser = new JSONParser();
    Object obj = parser.parse(new FileReader(file));
    JSONArray jsonArray = new JSONArray(obj.toString());
    for (int i = 0; i < jsonArray.length(); i++) {
      JSONObject jsonObject = jsonArray.getJSONObject(i);
      System.out.println(jsonObject.get("name"));
      System.out.println(jsonObject.get("city"));
      System.out.println(jsonObject.get("job"));
      jsonObject.getJSONArray("cars").forEach(System.out::println);
    }

Upvotes: 2

lokesh sharma
lokesh sharma

Reputation: 39

public class JsonParser {

    public static JSONObject parse(String file) {
        InputStream is = JsonParser.class.getClassLoader().getResourceAsStream(file);
        assert is != null;
        return new JSONObject(new JSONTokener(is));
    }
}
// Read Json 
    JSONObject deviceObj = new JSONObject(JsonParser.parse("Your Json filename").getJSONObject(deviceID).toString());

Perform logic to iterate

Upvotes: 1

Aman Garg
Aman Garg

Reputation: 127

Gson can be used here:

public Object getObjectFromJsonFile(String jsonData, Class classObject) {
    Gson gson = new Gson();
    JsonParser parser = new JsonParser();
    JsonObject object = (JsonObject) parser.parse(jsonData);
    return gson.fromJson(object, classObject);
}

Upvotes: 5

HIMANSHU GOYAL
HIMANSHU GOYAL

Reputation: 481

private static final JsonParser JSON_PARSER = new JsonParser();    
private static final String FILE_PATH = "configuration/data.json";

private JsonObject readJsonDataFromFile() {
    try {
        File indexFile = new File(FILE_PATH);
        String fileData = Files.toString(indexFile, Charsets.UTF_8);
        return (JsonObject) JSON_PARSER.parse(fileData);
    } catch (IOException | JsonParseException e) {
        String error = String.format("Error while reading file %s", FILE_PATH);
        log.error(error);
        throw new RuntimeException(error, e);
    }
}

Upvotes: 1

Arpit Raizada
Arpit Raizada

Reputation: 21

This issue occurs when you are importing the org. json library for JSONObject class. Instead you need to import org.json.simple library.

Upvotes: 1

Vladi
Vladi

Reputation: 2000

your json file look like this

enter image description here

import java.io.*;
import java.util.*;
import org.json.simple.*;
import org.json.simple.parser.*;
public class JSONReadFromTheFileTest {
   public static void main(String[] args) {
      JSONParser parser = new JSONParser();
      try {
         Object obj = parser.parse(new FileReader("/Users/User/Desktop/course.json"));
         JSONObject jsonObject = (JSONObject)obj;
         String name = (String)jsonObject.get("Name");
         String course = (String)jsonObject.get("Course");
         JSONArray subjects = (JSONArray)jsonObject.get("Subjects");
         System.out.println("Name: " + name);
         System.out.println("Course: " + course);
         System.out.println("Subjects:");
         Iterator iterator = subjects.iterator();
         while (iterator.hasNext()) {
            System.out.println(iterator.next());
         }
      } catch(Exception e) {
         e.printStackTrace();
      }
   }
}

the output is

Name: Raja
Course: MCA
Subjects:
subject1: MIS
subject2: DBMS
subject3: UML

took it from here

Upvotes: 0

Atul KS
Atul KS

Reputation: 990

Solution using Jackson library. Sorted this problem by verifying the json on JSONLint.com and then using Jackson. Below is the code for the same.

 Main Class:-

String jsonStr = "[{\r\n" + "       \"name\": \"John\",\r\n" + "        \"city\": \"Berlin\",\r\n"
                + "         \"cars\": [\r\n" + "            \"FIAT\",\r\n" + "          \"Toyata\"\r\n"
                + "     ],\r\n" + "     \"job\": \"Teacher\"\r\n" + "   },\r\n" + " {\r\n"
                + "     \"name\": \"Mark\",\r\n" + "        \"city\": \"Oslo\",\r\n" + "        \"cars\": [\r\n"
                + "         \"VW\",\r\n" + "            \"Toyata\"\r\n" + "     ],\r\n"
                + "     \"job\": \"Doctor\"\r\n" + "    }\r\n" + "]";

        ObjectMapper mapper = new ObjectMapper();

        MyPojo jsonObj[] = mapper.readValue(jsonStr, MyPojo[].class);

        for (MyPojo itr : jsonObj) {

            System.out.println("Val of getName is: " + itr.getName());
            System.out.println("Val of getCity is: " + itr.getCity());
            System.out.println("Val of getJob is: " + itr.getJob());
            System.out.println("Val of getCars is: " + itr.getCars() + "\n");

        }

POJO:

public class MyPojo {

private List<String> cars = new ArrayList<String>();

private String name;

private String job;

private String city;

public List<String> getCars() {
    return cars;
}

public void setCars(List<String> cars) {
    this.cars = cars;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getJob() {
    return job;
}

public void setJob(String job) {
    this.job = job;
}

public String getCity() {
    return city;
}

public void setCity(String city) {
    this.city = city;
} }

  RESULT:-
         Val of getName is: John
         Val of getCity is: Berlin
         Val of getJob is: Teacher
         Val of getCars is: [FIAT, Toyata]

          Val of getName is: Mark
          Val of getCity is: Oslo
          Val of getJob is: Doctor
          Val of getCars is: [VW, Toyata]

Upvotes: 0

lokesh sharma
lokesh sharma

Reputation: 39

Sample Json

{
    "per_page": 3,
    "total": 12,
    "data": [{
            "last_name": "Bluth",
            "id": 1,
            "avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/calebogden/128.jpg",
            "first_name": "George"
        },
        {
            "last_name": "Weaver",
            "id": 2,
            //"avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/josephstein/128.jpg",
            "first_name": "Janet"
        },
        {
            "last_name": "Wong",
            "id": 3,
            //"avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/olegpogodaev/128.jpg",
            "first_name": "Emma"
        }
    ],
    "page": 1,
    "total_pages": 4
}

First If statement will convert the single data from the body Second if statement will differentiate the JsonArray object

public static String getvalueJpath(JSONObject responseJson, String Jpath ) {
        Object obj = responseJson;
        for(String s : Jpath.split("/"))
            if (s.isEmpty())
                if(!(s.contains("[") || s.contains("]")))
                    obj = ((JSONObject) obj).get(s);
                else
                    if(s.contains("[") || s.contains("]"))
                        obj = ((JSONArray)((JSONObject)obj).get(s.split("\\[")[0])).get(Integer.parseInt(s.split("//[")[1].replaceAll("]", "")));

        return obj.toString();
    }
}

Upvotes: 0

Greg Kopff
Greg Kopff

Reputation: 16625

The whole file is an array and there are objects and other arrays (e.g. cars) in the whole array of the file.

As you say, the outermost layer of your JSON blob is an array. Therefore, your parser will return a JSONArray. You can then get JSONObjects from the array ...

  JSONArray a = (JSONArray) parser.parse(new FileReader("c:\\exer4-courses.json"));

  for (Object o : a)
  {
    JSONObject person = (JSONObject) o;

    String name = (String) person.get("name");
    System.out.println(name);

    String city = (String) person.get("city");
    System.out.println(city);

    String job = (String) person.get("job");
    System.out.println(job);

    JSONArray cars = (JSONArray) person.get("cars");

    for (Object c : cars)
    {
      System.out.println(c+"");
    }
  }

For reference, see "Example 1" on the json-simple decoding example page.

Upvotes: 112

P RAJESH
P RAJESH

Reputation: 23

package com.json;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class ReadJSONFile {

    public static void main(String[] args) {

        JSONParser parser = new JSONParser();

        try {
            Object obj = parser.parse(new FileReader("C:/My Workspace/JSON Test/file.json"));

            JSONArray array = (JSONArray) obj;
            JSONObject jsonObject = (JSONObject) array.get(0);

            String name = (String) jsonObject.get("name");
            System.out.println(name);

            String city = (String) jsonObject.get("city");
            System.out.println(city);

            String job = (String) jsonObject.get("job");
            System.out.println(job);

            // loop array
            JSONArray cars = (JSONArray) jsonObject.get("cars");
            Iterator<String> iterator = cars.iterator();
            while (iterator.hasNext()) {
                System.out.println(iterator.next());
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

}

Upvotes: 1

Srijan Sharma
Srijan Sharma

Reputation: 693

Might be of help for someone else facing the same issue.You can load the file as string and then can convert the string to jsonobject to access the values.

import java.util.Scanner;
import org.json.JSONObject;
String myJson = new Scanner(new File(filename)).useDelimiter("\\Z").next();
JSONObject myJsonobject = new JSONObject(myJson);

Upvotes: 7

Justinas Jakavonis
Justinas Jakavonis

Reputation: 8858

Add Jackson databind:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.0.pr2</version>
</dependency>

Create DTO class with related fields and read JSON file:

ObjectMapper objectMapper = new ObjectMapper();
ExampleClass example = objectMapper.readValue(new File("example.json"), ExampleClass.class);

Upvotes: 27

Ankur Mahajan
Ankur Mahajan

Reputation: 3596

Use google-simple library.

<dependency>
    <groupId>com.googlecode.json-simple</groupId>
    <artifactId>json-simple</artifactId>
    <version>1.1.1</version>
</dependency>

Please find the sample code below:

public static void main(String[] args) {
    try {
        JSONParser parser = new JSONParser();
        //Use JSONObject for simple JSON and JSONArray for array of JSON.
        JSONObject data = (JSONObject) parser.parse(
              new FileReader("/resources/config.json"));//path to the JSON file.

        String json = data.toJSONString();
    } catch (IOException | ParseException e) {
        e.printStackTrace();
    }
}

Use JSONObject for simple JSON like {"id":"1","name":"ankur"} and JSONArray for array of JSON like [{"id":"1","name":"ankur"},{"id":"2","name":"mahajan"}].

Upvotes: 9

Rajat Mahajan
Rajat Mahajan

Reputation: 7

You can use readAllBytes.

return String(Files.readAllBytes(Paths.get(filePath)),StandardCharsets.UTF_8);

Upvotes: -4

Teddy
Teddy

Reputation: 151

Reading from JsonFile

public static ArrayList<Employee> readFromJsonFile(String fileName){
        ArrayList<Employee> result = new ArrayList<Employee>();

        try{
            String text = new String(Files.readAllBytes(Paths.get(fileName)), StandardCharsets.UTF_8);

            JSONObject obj = new JSONObject(text);
            JSONArray arr = obj.getJSONArray("employees");

            for(int i = 0; i < arr.length(); i++){
                String name = arr.getJSONObject(i).getString("name");
                short salary = Short.parseShort(arr.getJSONObject(i).getString("salary"));
                String position = arr.getJSONObject(i).getString("position");
                byte years_in_company = Byte.parseByte(arr.getJSONObject(i).getString("years_in_company")); 
                if (position.compareToIgnoreCase("manager") == 0){
                    result.add(new Manager(name, salary, position, years_in_company));
                }
                else{
                    result.add(new OrdinaryEmployee(name, salary, position, years_in_company));
                }
            }           
        }
        catch(Exception ex){
            System.out.println(ex.toString());
        }
        return result;
    }

Upvotes: 15

rehan hanar
rehan hanar

Reputation: 11

Hope this example helps too

I have done java coding in a similar way for the below json array example as follows :

following is the json data format : stored as "EMPJSONDATA.json"

[{"EMPNO":275172,"EMP_NAME":"Rehan","DOB":"29-02-1992","DOJ":"10-06-2013","ROLE":"JAVA DEVELOPER"},

{"EMPNO":275173,"EMP_NAME":"G.K","DOB":"10-02-1992","DOJ":"11-07-2013","ROLE":"WINDOWS ADMINISTRATOR"},

{"EMPNO":275174,"EMP_NAME":"Abiram","DOB":"10-04-1992","DOJ":"12-08-2013","ROLE":"PROJECT ANALYST"}

{"EMPNO":275174,"EMP_NAME":"Mohamed Mushi","DOB":"10-04-1992","DOJ":"12-08-2013","ROLE":"PROJECT ANALYST"}]

public class Jsonminiproject {

public static void main(String[] args) {

      JSONParser parser = new JSONParser();

    try {
        JSONArray a = (JSONArray) parser.parse(new FileReader("F:/JSON DATA/EMPJSONDATA.json"));
        for (Object o : a)
        {
            JSONObject employee = (JSONObject) o;

            Long no = (Long) employee.get("EMPNO");
            System.out.println("Employee Number : " + no);

            String st = (String) employee.get("EMP_NAME");
            System.out.println("Employee Name : " + st);

            String dob = (String) employee.get("DOB");
            System.out.println("Employee DOB : " + dob);

            String doj = (String) employee.get("DOJ");
            System.out.println("Employee DOJ : " + doj);

            String role = (String) employee.get("ROLE");
            System.out.println("Employee Role : " + role);

            System.out.println("\n");

        }


    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }




}

}

Upvotes: 1

Delvin
Delvin

Reputation: 41

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class Delete_01 {
    public static void main(String[] args) throws FileNotFoundException,
            IOException, ParseException {

        JSONParser parser = new JSONParser();
        JSONArray jsonArray = (JSONArray) parser.parse(new FileReader(
                "delete_01.json"));

        for (Object o : jsonArray) {
            JSONObject person = (JSONObject) o;

            String strName = (String) person.get("name");
            System.out.println("Name::::" + strName);

            String strCity = (String) person.get("city");
            System.out.println("City::::" + strCity);

            JSONArray arrays = (JSONArray) person.get("cars");
            for (Object object : arrays) {
                System.out.println("cars::::" + object);
            }
            String strJob = (String) person.get("job");
            System.out.println("Job::::" + strJob);
            System.out.println();

        }

    }
}

Upvotes: 4

Mady
Mady

Reputation: 5296

You can use jackson library and simply use these 3 lines to convert your json file to Java Object.

ObjectMapper mapper = new ObjectMapper();
InputStream is = Test.class.getResourceAsStream("/test.json");
testObj = mapper.readValue(is, Test.class);

Upvotes: 85

Related Questions