Hoe json-bestand in Java te lezen met een eenvoudige JSON-bibliotheek

Ik wil dit JSON-bestand met java lezen met de json simple library.

Mijn JSON-bestand ziet er als volgt uit:

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

Dit is de Java-code die ik heb geschreven om dit bestand te lezen:

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

Maar ik krijg de volgende uitzondering:

Uitzondering in thread “main” java.lang.ClassCastException:
org.json.simple.JSONArray kan niet worden gecast naar org.json.simple.JSONObject
op javaapplication1.JavaApplication1.main(JavaApplication1.java:24)

Kan iemand me vertellen wat ik verkeerd doe? Het hele bestand is een array en er zijn objecten en een andere array (auto’s) in de hele array van het bestand. Maar ik weet niet hoe ik de hele array in een java-array kan ontleden. Ik hoop dat iemand me kan helpen met een coderegel die ik mis in mijn code.

Bedankt


Antwoord 1, autoriteit 100%

Het hele bestand is een array en er zijn objecten en andere arrays (bijv. auto’s) in de hele array van het bestand.

Zoals je zegt, is de buitenste laag van je JSON-blob een array. Daarom retourneert uw parser een JSONArray. U kunt dan JSONObjects uit de array halen …

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

Zie voor referentie ‘Voorbeeld 1’ in het voorbeeld van json-simple decoderingpagina.


Antwoord 2, autoriteit 56%

U kunt de jackson-bibliotheek gebruiken en deze 3 regels gebruiken om uw json-bestand naar Java Object te converteren.

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

Antwoord 3, autoriteit 17%

Jackson databind toevoegen:

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

Maak een DTO-klasse met gerelateerde velden en lees het JSON-bestand:

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

Antwoord 4, autoriteit 13%

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

Antwoord 5, autoriteit 8%

Je kunt hiervoor Gsongebruiken.
GSONis een Java-bibliotheek die kan worden gebruikt om Java-objecten om te zetten in hun JSON-representatie. Het kan ook worden gebruikt om een JSON-tekenreeks te converteren naar een equivalent Java-object.

Kijk eens naar deze JSON converteren naar Java


Antwoord 6, autoriteit 7%

Gebruik google-simple bibliotheek.

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

Hieronder vindt u de voorbeeldcode:

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

Gebruik JSONObject voor eenvoudige JSON zoals {"id":"1","name":"ankur"}en JSONArray voor arrays van JSON zoals [{"id":"1","name":"ankur"},{"id":"2","name":"mahajan"}].


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

Antwoord 8, autoriteit 4%

Misschien nuttig voor iemand anders die met hetzelfde probleem wordt geconfronteerd. U kunt het bestand als tekenreeks laden en vervolgens de tekenreeks converteren naar jsonobject om toegang te krijgen tot de waarden.

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

Antwoord 9

Ik hoop dat dit voorbeeld ook helpt

Ik heb Java-codering op een vergelijkbare manier gedaan voor het onderstaande json-arrayvoorbeeld als volgt:

hierna volgt het json-gegevensformaat: opgeslagen als “EMPJSONDATA.json”

[{“EMPNO”:275172,”EMP_NAME”:”Rehan”,”DOB”:”29-02-1992″,”DOJ”:”10-06-2013″,”ROLE”:”JAVA-ONTWIKKELAAR “},

{“EMPNO”:275173,”EMP_NAME”:”GK”,”DOB”:”10-02-1992″,”DOJ”:”11-07-2013″,”ROLE”:”WINDOWS-BEHEERDER” },

{“EMPNO”:275174,”EMP_NAME”:”Abiram”,”DOB”:”10-04-1992″,”DOJ”:”12-08-2013″,”ROLE”:”PROJECTANALYST” }

{“EMPNO”:275174,”EMP_NAME”:”Mohamed Mushi”,”DOB”:”10-04-1992″,”DOJ”:”12-08-2013″,”ROLE”:”PROJECTANALYST “}]

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

Antwoord 10

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

Antwoord 11

Gsonkan hier worden gebruikt:

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

Antwoord 12

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

Eerste If-instructie converteert de enkele gegevens van de body
Ten tweede zal de if-instructie het JsonArray-object onderscheiden

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

Antwoord 13

Oplossing met Jackson-bibliotheek. Dit probleem is opgelost door de json op JSONLint.com te verifiëren en vervolgens Jackson te gebruiken. Hieronder staat de code voor hetzelfde.

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]

Antwoord 14

Dit probleem doet zich voor wanneer u de organisatie importeert. json-bibliotheek voor de JSONObject-klasse. In plaats daarvan moet je de bibliotheek org.json.simple importeren.


Antwoord 15

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

Antwoord 16

uw json-bestand ziet er zo uit

voer hier de afbeeldingsbeschrijving in

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

de uitvoer is

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

nam het hier vandaan


Antwoord 17

U kunt readAllBytes gebruiken.

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

Other episodes