Lesen von JSON-Dateien in Java mit einer einfachen JSON-Bibliothek

91

Ich möchte diese JSONDatei mit Java unter Verwendung der einfachen Bibliothek von json lesen .

Meine JSONDatei sieht folgendermaßen aus:

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

Dies ist der Java-Code, den ich geschrieben habe, um diese Datei zu lesen:

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

Aber ich bekomme folgende Ausnahme:

Ausnahme im Thread "main" java.lang.ClassCastException: org.json.simple.JSONArray kann unter javaapplication1.JavaApplication1.main (JavaApplication1.java:24) nicht in org.json.simple.JSONObject umgewandelt werden.

Kann mir jemand sagen, was ich falsch mache? Die gesamte Datei ist ein Array, und im gesamten Array der Datei befinden sich Objekte und ein anderes Array (Autos). Aber ich weiß nicht, wie ich das gesamte Array in ein Java-Array analysieren kann. Ich hoffe, jemand kann mir mit einer Codezeile helfen, die mir in meinem Code fehlt.

Vielen Dank

billz
quelle

Antworten:

83

Die gesamte Datei ist ein Array, und im gesamten Array der Datei befinden sich Objekte und andere Arrays (z. B. Autos).

Wie Sie sagen, ist die äußerste Schicht Ihres JSON-Blobs ein Array. Daher gibt Ihr Parser a zurück JSONArray. Sie können dann JSONObjects aus dem Array erhalten ...

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

Eine Referenz finden Sie unter "Beispiel 1" auf der Beispielseite für die json-einfache Dekodierung .

Greg Kopff
quelle
Vielen Dank. Es liest den ersten Objektkurs, den Kursleiter, das Studentenarray und das Titelobjekt. Wie kann ich auch die nächsten lesen?
Billz
Nun, Sie möchten alle Elemente im Array in einer Schleife verarbeiten. Mein Code gibt Ihnen nur das erste Element ( a.get(0)), da dies Ihrem ursprünglichen Code am ehesten entspricht. Die json-einfache Dokumentation sagt aJSONArray is java.util.List, sodass Sie die Elemente wie bei einer normalen Liste durchlaufen können. Ist das genug, um weiterzumachen?
Greg Kopff
Ich habe das versucht, aber es hat nicht funktioniert. Können Sie mir ein Codebeispiel geben
billz
3
Das funktioniert super! Bitte beachten Sie: Verwenden Sie den Import wie in diesem Beispiel (dh mit 'einfach'), da sonst nicht 'für jeden' zulässig ist. Falsch: import org.json.JSONArray; import org.json.JSONObject; Richtig: import org.json.simple.JSONArray; import org.json.simple.JSONObject;
Krishna Sapkota
1
parserAus welcher Bibliothek (Import) ist es?
Benutzer25
45

Sie können die Jackson-Bibliothek verwenden und einfach diese 3 Zeilen verwenden, um Ihre JSON-Datei in Java Object zu konvertieren.

ObjectMapper mapper = new ObjectMapper();
InputStream is = Test.class.getResourceAsStream("/test.json");
testObj = mapper.readValue(is, Test.class);
Mady
quelle
1
Darf ich die ObjectMapper-JAR-Links zum Herunterladen kennen?
Rence Abishek
1
@RenceAbishek Sie importieren es mitimport com.fasterxml.jackson.databind.ObjectMapper;
Ron Kalian
10

Jackson-Datenbindung hinzufügen:

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

Erstellen Sie eine DTO-Klasse mit zugehörigen Feldern und lesen Sie die JSON-Datei:

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

Lesen aus 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
quelle
7

Sie können Gson dafür verwenden.
GSONist eine Java-Bibliothek, mit der Java-Objekte in ihre JSONDarstellung konvertiert werden können . Es kann auch verwendet werden, um a zu konvertierenJSON Zeichenfolge in ein äquivalentes Java-Objekt .

Schauen Sie sich diese Konvertierung von JSON in Java an

Sumit Singh
quelle
16
Sie denken, er sollte die Bibliothek wechseln, weil er einen Haken hat? Nicht gerade der direkteste Weg, um sein Programm zum Laufen zu bringen ... ;-)
Greg Kopff
5

Verwenden Sie die einfache Google-Bibliothek.

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

Den folgenden Beispielcode finden Sie unten:

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

Verwenden Sie JSONObject für einfache JSON-ähnliche {"id":"1","name":"ankur"}und JSONArray für JSON-ähnliche Arrays [{"id":"1","name":"ankur"},{"id":"2","name":"mahajan"}].

Ankur Mahajan
quelle
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
quelle
4

Dies kann für andere Personen hilfreich sein, die mit demselben Problem konfrontiert sind. Sie können die Datei als Zeichenfolge laden und dann die Zeichenfolge in jsonobject konvertieren, um auf die Werte zuzugreifen.

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
quelle
1

Hoffe, dieses Beispiel hilft auch

Ich habe die Java-Codierung für das folgende Beispiel für ein JSON-Array auf ähnliche Weise durchgeführt:

Das folgende json-Datenformat wird als "EMPJSONDATA.json" gespeichert.

[{"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
quelle
Unerwarteter Token LEFT BRACE ({) an 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
quelle
Ihre
2
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
Timothy Truckle
0

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

Die erste If-Anweisung konvertiert die einzelnen Daten aus dem Hauptteil. Zweitens unterscheidet die if-Anweisung das JsonArray-Objekt

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
quelle
0

Lösung mit Jackson-Bibliothek. Sortierte dieses Problem, indem der json auf JSONLint.com überprüft und dann Jackson verwendet wurde. Unten ist der Code für das gleiche.

 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
quelle
-2

Sie können readAllBytes verwenden.

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

Rajat Mahajan
quelle
1
In der ursprünglichen Frage wird nach dem Einlesen in ein JSON-Objekt und nicht nach einer Zeichenfolge gefragt.
Aaron