【问题标题】:How to read json file into java with simple JSON library如何使用简单的 JSON 库将 json 文件读入 java
【发布时间】:2012-06-11 04:26:48
【问题描述】:

我想使用 json 简单库通过 java 阅读这个 JSON 文件。

我的JSON 文件如下所示:

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

这是我为读取此文件而编写的 java 代码:

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

但我得到以下异常:

线程“主”java.lang.ClassCastException 中的异常: org.json.simple.JSONArray 不能转换为 org.json.simple.JSONObject 在 javaapplication1.JavaApplication1.main(JavaApplication1.java:24)

谁能告诉我我做错了什么?整个文件是一个数组,文件的整个数组中有对象和另一个数组(汽车)。但我不知道如何将整个数组解析为 java 数组。我希望有人可以帮助我解决我的代码中缺少的代码行。

谢谢

【问题讨论】:

    标签: java json parsing json-simple


    【解决方案1】:

    以下是您的问题陈述的有效解决方案,

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

    【讨论】:

      【解决方案2】:
      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());
      

      执行逻辑迭代

      【讨论】:

        【解决方案3】:

        Gson可以在这里使用:

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

        【讨论】:

          【解决方案4】:
          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);
              }
          }
          

          【讨论】:

            【解决方案5】:

            当您导入组织时会出现此问题。 JSONObject 类的 json 库。相反,您需要导入 org.json.simple 库。

            【讨论】:

              【解决方案6】:

              您的 json 文件如下所示

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

              输出是

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

              took it from here

              【讨论】:

                【解决方案7】:

                使用 Jackson 库的解决方案。通过验证 JSONLint.com 上的 json 然后使用 Jackson 对这个问题进行排序。以下是相同的代码。

                 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]
                

                【讨论】:

                  【解决方案8】:

                  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 语句将转换正文中的单个数据 第二个 if 语句将区分 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();
                      }
                  }
                  

                  【讨论】:

                    【解决方案9】:

                    整个文件是一个数组,文件的整个数组中有对象和其他数组(例如汽车)。

                    如您所说,JSON blob 的最外层是一个数组。因此,您的解析器将返回一个JSONArray。然后您可以从数组中获取JSONObjects ...

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

                    有关参考,请参阅json-simple decoding example 页面上的“示例 1”。

                    【讨论】:

                    • 谢谢。它读取第一个对象 course、instructor、students 数组和 title 对象。我怎样才能阅读下一个?
                    • 好吧,您想循环处理数组中的所有项目。我的代码只是为您提供第一项 (a.get(0)),因为这是与您的原始代码最接近的匹配项。 json-simple 文档说JSONArrayjava.util.List,所以你可以像普通列表一样迭代元素。这足以继续吗?
                    • 这很好用!请注意:在此示例中按原样使用导入(即使用“simple”),否则将不允许“for each”。错误:导入 org.json.JSONArray;导入 org.json.JSONObject;正确:导入 org.json.simple.JSONArray;导入 org.json.simple.JSONObject;
                    • 如何给FileReader一个相对路径,可能来自/resources文件夹
                    • parser 来自哪个库(导入)?
                    【解决方案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();
                            }
                        }
                    
                    }
                    

                    【讨论】:

                    • 你的 JSON 文件有一个对象数组,所以遍历数组
                    • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
                    【解决方案11】:

                    可能对面临相同问题的其他人有所帮助。您可以将文件加载为字符串,然后可以将字符串转换为 jsonobject 以访问值。

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

                    【讨论】:

                      【解决方案12】:

                      添加 Jackson 数据绑定:

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

                      创建具有相关字段的 DTO 类并读取 JSON 文件:

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

                      【讨论】:

                        【解决方案13】:

                        使用 google-simple 库。

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

                        请在下面找到示例代码:

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

                        将 JSONObject 用于简单的 JSON,例如 {"id":"1","name":"ankur"},将 JSONArray 用于 JSON 数组,例如 [{"id":"1","name":"ankur"},{"id":"2","name":"mahajan"}]

                        【讨论】:

                          【解决方案14】:

                          您可以使用 readAllBytes。

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

                          【讨论】:

                          • 原始问题询问有关读取 JSON 对象而不是字符串的问题。
                          【解决方案15】:

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

                          【讨论】:

                            【解决方案16】:

                            希望这个例子也有帮助

                            对于下面的 json 数组示例,我以类似的方式完成了 java 编码,如下所示:

                            以下是json数据格式:存储为“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 管理员" },

                            {"EMPNO":275174,"EMP_NAME":"Abiram","DOB":"10-04-1992","DOJ":"12-08-2013","ROLE":"项目分析员" }

                            {"EMPNO":275174,"EMP_NAME":"Mohamed Mushi","DOB":"10-04-1992","DOJ":"12-08-2013","ROLE":"项目分析员"}]

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

                            【讨论】:

                            • 第 156 位的意外标记左括号({)。
                            【解决方案17】:
                            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();
                            
                                    }
                            
                                }
                            }
                            

                            【讨论】:

                              【解决方案18】:

                              您可以使用 jackson 库并简单地使用这 3 行将您的 json 文件转换为 Java 对象。

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

                              【讨论】:

                              • 我可以知道要下载的 ObjectMapper jar 链接吗?
                              • @RenceAbishek 你用import com.fasterxml.jackson.databind.ObjectMapper;导入它
                              猜你喜欢
                              • 2020-10-06
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2021-05-20
                              • 1970-01-01
                              • 1970-01-01
                              • 2017-01-18
                              • 2017-05-08
                              相关资源
                              最近更新 更多