Comment lire un fichier JSON en Java avec une bibliothèque JSON simple

95

Je veux lire ce JSONfichier avec java en utilisant la bibliothèque simple json.

Mon JSONfichier ressemble à ceci:

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

Voici le code java que j'ai écrit pour lire ce fichier:

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

Mais j'obtiens l'exception suivante:

Exception dans le thread "main" java.lang.ClassCastException: org.json.simple.JSONArray ne peut pas être converti en org.json.simple.JSONObject à javaapplication1.JavaApplication1.main (JavaApplication1.java:24)

Quelqu'un peut-il me dire ce que je fais mal? Le fichier entier est un tableau et il y a des objets et un autre tableau (voitures) dans tout le tableau du fichier. Mais je ne sais pas comment je peux analyser le tableau entier dans un tableau java. J'espère que quelqu'un pourra m'aider avec une ligne de code qui me manque dans mon code.

Merci

billz
la source

Réponses:

85

Le fichier entier est un tableau et il y a des objets et d'autres tableaux (par exemple des voitures) dans tout le tableau du fichier.

Comme vous le dites, la couche la plus externe de votre objet blob JSON est un tableau. Par conséquent, votre analyseur retournera un fichier JSONArray. Vous pouvez alors obtenir des JSONObjects du tableau ...

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

Pour référence, voir «Exemple 1» sur la page d' exemple de décodage json-simple .

Greg Kopff
la source
Merci. Il lit le premier cours d'objet, l'instructeur, le tableau des étudiants et l'objet titre. Comment puis-je lire les prochains aussi?
billz
Eh bien, vous souhaitez traiter tous les éléments du tableau dans une boucle. Mon code vous donne juste le premier élément ( a.get(0)) car il correspond le plus à votre code d'origine. La documentation json-simple dit que JSONArrayest java.util.List, donc vous pouvez parcourir les éléments comme vous le feriez pour une liste normale. Est-ce suffisant pour continuer?
Greg Kopff
J'ai essayé mais cela n'a pas fonctionné. Pouvez-vous me donner un exemple de code
billz
3
Cela fonctionne très bien! Remarque: utilisez l'import tel quel dans cet exemple (c'est-à-dire avec «simple»), sinon il ne permettra pas «pour chacun». Mauvais: import org.json.JSONArray; import org.json.JSONObject; Correct: import org.json.simple.JSONArray; import org.json.simple.JSONObject;
Krishna Sapkota
1
parserde quelle bibliothèque (importation) est-il?
user25
46

Vous pouvez utiliser la bibliothèque jackson et utiliser simplement ces 3 lignes pour convertir votre fichier json en objet Java.

ObjectMapper mapper = new ObjectMapper();
InputStream is = Test.class.getResourceAsStream("/test.json");
testObj = mapper.readValue(is, Test.class);
Mady
la source
1
Puis-je connaître les liens jar ObjectMapper à télécharger.
Rence Abishek
1
@RenceAbishek vous l'importez avecimport com.fasterxml.jackson.databind.ObjectMapper;
Ron Kalian
11

Ajouter la base de données Jackson:

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

Créez une classe DTO avec des champs associés et lisez le fichier JSON:

ObjectMapper objectMapper = new ObjectMapper();
ExampleClass example = objectMapper.readValue(new File("example.json"), ExampleClass.class);
Tout comme
la source
10

Lecture depuis 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;
    }
Teddy
la source
7

Vous pouvez utiliser Gson pour cela.
GSONest une bibliothèque Java qui peut être utilisée pour convertir des objets Java en leur JSONreprésentation. Il peut également être utilisé pour convertir une JSONchaîne en un objet Java équivalent.

Jetez un œil à cette conversion de JSON en Java

Sumit Singh
la source
17
Vous pensez qu'il devrait changer de bibliothèque parce qu'il a rencontré un problème? Ce n'est pas exactement le moyen le plus direct de faire fonctionner son programme ... ;-)
Greg Kopff
5

Utilisez la bibliothèque google-simple.

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

Veuillez trouver l'exemple de code ci-dessous:

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

Utilisez JSONObject pour un JSON simple comme {"id":"1","name":"ankur"}et JSONArray pour un tableau de JSON comme [{"id":"1","name":"ankur"},{"id":"2","name":"mahajan"}].

Ankur Mahajan
la source
4
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();

        }

    }
}
Delvin
la source
4

Cela peut être utile pour quelqu'un d'autre confronté au même problème. Vous pouvez charger le fichier sous forme de chaîne, puis convertir la chaîne en jsonobject pour accéder aux valeurs.

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

J'espère que cet exemple vous aidera aussi

J'ai fait du codage java de la même manière pour l'exemple de tableau json ci-dessous:

Voici le format de données json: stocké sous "EMPJSONDATA.json"

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

{"EMPNO": 275173, "EMP_NAME": "GK", "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();
    }




}

}
Rehan Hanar
la source
Jeton inattendu LEFT BRACE ({) à la position 156.
Thanga
1
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();
        }
    }

}
P RAJESH
la source
Votre fichier JSON a un tableau d'objets afin de traverser le tableau
P RAJESH
2
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire sur la manière et / ou la raison pour laquelle il résout le problème améliorerait la valeur à long terme de la réponse.
Timothy Truckle
0

Échantillon 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
}

La première instruction If convertira les données uniques du corps La deuxième instruction if différenciera l'objet JsonArray

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();
    }
}
lokesh sharma
la source
0

Solution utilisant la bibliothèque Jackson. J'ai résolu ce problème en vérifiant le json sur JSONLint.com, puis en utilisant Jackson. Vous trouverez ci-dessous le code pour le même.

 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]
Atul Sharma
la source
0

votre fichier json ressemble à ceci

entrez la description de l'image ici

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

la sortie est

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

pris d'ici

Sportac
la source
-2

Vous pouvez utiliser readAllBytes.

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

Rajat Mahajan
la source
1
La question d'origine concerne la lecture dans un objet JSON et non dans une chaîne.
Aaron