How to read json file into java with simple JSON library

JavaJsonParsingJson Simple

Java Problem Overview


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

Java Solutions


Solution 1 - Java

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

Solution 2 - Java

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);

Solution 3 - Java

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);

Solution 4 - Java

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

Solution 5 - Java

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

Solution 6 - Java

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);


Solution 7 - Java

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);
}

Solution 8 - Java

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();

		}

	}
}

Solution 9 - Java

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();
	}
		
		
	

}

}

Solution 10 - Java

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();
		}
	}

}

Solution 11 - Java

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

Solution 12 - Java

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);
    }
}

Solution 13 - Java

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

Solution 14 - Java

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);
    }

Solution 15 - Java

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();
	}
}

Solution 16 - Java

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]

Solution 17 - Java

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

Solution 18 - Java

You can use readAllBytes.

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionbillzView Question on Stackoverflow
Solution 1 - JavaGreg KopffView Answer on Stackoverflow
Solution 2 - JavaMadyView Answer on Stackoverflow
Solution 3 - JavaJustinas JakavonisView Answer on Stackoverflow
Solution 4 - JavaTeddyView Answer on Stackoverflow
Solution 5 - JavaAnkur MahajanView Answer on Stackoverflow
Solution 6 - JavaSrijan SharmaView Answer on Stackoverflow
Solution 7 - JavaAman GargView Answer on Stackoverflow
Solution 8 - JavaDelvinView Answer on Stackoverflow
Solution 9 - Javarehan hanarView Answer on Stackoverflow
Solution 10 - JavaP RAJESHView Answer on Stackoverflow
Solution 11 - JavaArpit RaizadaView Answer on Stackoverflow
Solution 12 - JavaHIMANSHU GOYALView Answer on Stackoverflow
Solution 13 - Javalokesh sharmaView Answer on Stackoverflow
Solution 14 - JavaBipin Kumar ChaurasiaView Answer on Stackoverflow
Solution 15 - Javalokesh sharmaView Answer on Stackoverflow
Solution 16 - JavaAtul Kumar SharmaView Answer on Stackoverflow
Solution 17 - JavaVladiView Answer on Stackoverflow
Solution 18 - JavaRajat MahajanView Answer on Stackoverflow