Jak czytać plik json do javy za pomocą prostej biblioteki JSON

95

Chcę przeczytać ten JSONplik za pomocą javy przy użyciu prostej biblioteki JSON.

Mój JSONplik wygląda następująco:

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

Oto kod java, który napisałem, aby odczytać ten plik:

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

Ale mam następujący wyjątek:

Wyjątek w wątku „main” java.lang.ClassCastException: org.json.simple.JSONArray nie może być rzutowany na org.json.simple.JSONObject w javaapplication1.JavaApplication1.main (JavaApplication1.java:24)

Czy ktoś może mi powiedzieć, co robię źle? Cały plik jest tablicą, aw całej tablicy pliku znajdują się obiekty i inna tablica (samochody). Ale nie wiem, jak mogę przeanalizować całą tablicę do tablicy java. Mam nadzieję, że ktoś może mi pomóc z linią kodu, której brakuje w moim kodzie.

Dzięki

billz
źródło

Odpowiedzi:

85

Cały plik jest tablicą, aw całej tablicy pliku znajdują się obiekty i inne tablice (np. Samochody).

Jak mówisz, najbardziej zewnętrzną warstwą obiektu blob JSON jest tablica. Dlatego twój parser zwróci plik JSONArray. Możesz wtedy pobrać JSONObjects z tablicy ...

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

Aby uzyskać więcej informacji, zobacz „Przykład 1” na stronie przykładowego dekodowania w formacie JSON .

Greg Kopff
źródło
Dzięki. Odczytuje pierwszy obiekt kursu, instruktora, tablicę uczniów i obiekt tytułu. Jak mogę przeczytać następne?
billz
Cóż, chcesz przetworzyć wszystkie elementy w tablicy w pętli. Mój kod po prostu pobiera pierwszą pozycję ( a.get(0)), ponieważ była to najbliższa zgodność z oryginalnym kodem. Dokumentacja json-simple mówi, że a JSONArrayjest java.util.List, więc możesz iterować po elementach, tak jak w przypadku zwykłej listy. Czy to wystarczy, aby kontynuować?
Greg Kopff
Próbowałem tego, ale to nie zadziałało. Czy możesz podać przykład kodu
billz
3
To działa świetnie! Uwaga: użyj importu tak, jak jest w tym przykładzie (tj. Z „prostym”), w przeciwnym razie nie zezwoli na „dla każdego”. Źle: import org.json.JSONArray; import org.json.JSONObject; Poprawnie: import org.json.simple.JSONArray; import org.json.simple.JSONObject;
Krishna Sapkota
1
parserz której biblioteki (importu) to jest?
user25
47

Możesz użyć biblioteki jackson i po prostu użyć tych 3 linii, aby przekonwertować plik json na obiekt Java.

ObjectMapper mapper = new ObjectMapper();
InputStream is = Test.class.getResourceAsStream("/test.json");
testObj = mapper.readValue(is, Test.class);
Mady
źródło
1
Czy mogę poznać linki do plików jar ObjectMapper do pobrania.
Rence Abishek
1
@RenceAbishek importujesz to zimport com.fasterxml.jackson.databind.ObjectMapper;
Ron Kalian
12

Dodaj bazę danych Jacksona:

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

Utwórz klasę DTO z powiązanymi polami i przeczytaj plik JSON:

ObjectMapper objectMapper = new ObjectMapper();
ExampleClass example = objectMapper.readValue(new File("example.json"), ExampleClass.class);
Justinas Jakavonis
źródło
10

Czytanie z 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;
    }
Miś
źródło
7

Możesz do tego użyć Gson .
GSONjest biblioteką Java, której można użyć do konwersji obiektów Java na ich JSONreprezentacje. Może być również używany do konwersji plikuJSON znaków na równoważny obiekt Java.

Spójrz na to Konwertowanie JSON na Javę

Sumit Singh
źródło
17
Myślisz, że powinien zmienić biblioteki, ponieważ trafił w jedną przeszkodę? Nie jest to najbardziej bezpośrednia droga do uruchomienia jego programu ... ;-)
Greg Kopff
5

Użyj prostej biblioteki Google.

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

Poniżej przykładowy kod:

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

Użyj JSONObject do prostego JSON podobnego {"id":"1","name":"ankur"}i JSONArray do tablicy podobnej do JSON [{"id":"1","name":"ankur"},{"id":"2","name":"mahajan"}].

Ankur Mahajan
źródło
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
źródło
4

Może być pomocne dla kogoś innego, kto ma ten sam problem. Możesz załadować plik jako ciąg, a następnie przekonwertować ciąg na jsonobject, aby uzyskać dostęp do wartości.

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
źródło
1

Mam nadzieję, że ten przykład też pomoże

Zrobiłem kodowanie Java w podobny sposób dla poniższego przykładu tablicy json w następujący sposób:

następujący format danych json: zapisany jako „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": "ADMINISTRATOR WINDOWS"},

{"EMPNO": 275174, "EMP_NAME": "Abiram", "Data urodzenia": "10-04-1992", "DOJ": "12-08-2013", "ROLE": "ANALIZA PROJEKTU"}

{"EMPNO": 275174, "EMP_NAME": "Mohamed Mushi", "Data urodzenia": "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
źródło
Nieoczekiwany token LEFT BRACE ({) na pozycji 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
źródło
Twój plik JSON zawiera tablicę obiektów, więc przechodzi przez tablicę
P RAJESH
2
Chociaż ten kod może odpowiedzieć na pytanie, dostarczenie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi.
Timothy Truckle
0

Przykładowe 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
}

Pierwsza instrukcja If spowoduje konwersję pojedynczych danych z treści Second if instrukcja będzie różnicować obiekt 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
źródło
0

Rozwiązanie wykorzystujące bibliotekę Jackson. Rozwiązaliśmy ten problem, weryfikując plik json w witrynie JSONLint.com, a następnie używając Jacksona. Poniżej znajduje się kod tego samego.

 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
źródło
0

Twój plik json wygląda następująco

wprowadź opis obrazu tutaj

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

wyjście jest

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

wziąłem to stąd

Sportac
źródło
0

Ten problem występuje podczas importowania pliku org. json dla klasy JSONObject. Zamiast tego musisz zaimportować bibliotekę org.json.simple.

Arpit Raizada
źródło
-2

Możesz użyć readAllBytes.

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

Rajat Mahajan
źródło
1
Oryginalne pytanie dotyczy odczytu do obiektu JSON, a nie ciągu.
Aaron