如何使用简单的JSON库将json文件读入java

时间:2012-06-07 05:51:38

标签: java json parsing json-simple

我想使用json simple library读取这个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();
        }
    }
}

但我得到以下例外:

  

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

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

由于

17 个答案:

答案 0 :(得分:67)

  

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

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

  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”。

答案 1 :(得分:32)

您可以使用jackson库并只使用这3行将您的json文件转换为Java Object。

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

答案 2 :(得分:6)

您可以使用Gson
GSON是一个Java库,可用于将Java对象转换为JSON表示形式。它还可用于将JSON字符串转换为等效的Java对象。

看看这个Converting JSON to Java

答案 3 :(得分:6)

添加Jackson databind:

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

答案 4 :(得分:6)

从JsonFile读取

...
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
...

// Manage the mongo db connection...
List<ServerAddress> seeds = new ArrayList<ServerAddress>();
seeds.add( new ServerAddress(configuration.getMongoHost(), configuration.getMongoPort() ));
List<MongoCredential> credentials = new ArrayList<MongoCredential>();
credentials.add(
    MongoCredential.createScramSha1Credential(
        configuration.getMongoUser(),
        configuration.getMongoDb(),
        configuration.getMongoPassword().toCharArray()
    )
);
MongoClient mongo = new MongoClient( seeds, credentials );

答案 5 :(得分:4)

使用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"}]

答案 6 :(得分:4)

// create your requests
$requests[] = $client->createRequest('GET', '/endpoint', ['config' => ['order_id' => 123]]);
...
// in your success callback get 
$id = $event->getRequest()->getConfig()['order_id']

答案 7 :(得分:2)

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

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

答案 8 :(得分:1)

希望这个例子也有帮助

我已经以类似的方式对下面的json数组示例进行了java编码,如下所示:

以下是json数据格式:存储为&#34; EMPJSONDATA.json&#34;

[{&#34; EMPNO&#34;:275172,&#34; EMP_NAME&#34;:&#34;热汗&#34;&#34; DOB&#34;:&#34; 29-02 -1992&#34;,&#34; DOJ&#34;:&#34; 10-06-2013&#34;,&#34; ROLE&#34;:&#34; JAVA DEVELOPER&#34;},

{&#34; EMPNO&#34;:275173,&#34; EMP_NAME&#34;:&#34; G.K&#34;&#34; DOB&#34;:&#34; 10- 02-1992&#34;,&#34; DOJ&#34;:&#34; 11-07-2013&#34;,&#34; ROLE&#34;:&#34; WINDOWS ADMINISTRATOR&#34;},< / p>

{&#34; EMPNO&#34;:275174,&#34; EMP_NAME&#34;:&#34;亚比兰&#34;&#34; DOB&#34;:&#34; 10-04- 1992&#34;,&#34; DOJ&#34;:&#34; 12-08-2013&#34;,&#34; ROLE&#34;:&#34; PROJECT ANALYST&#34;}

{&#34; EMPNO&#34;:275174,&#34; EMP_NAME&#34;:&#34; Mohamed Mushi&#34;,&#34; DOB&#34;:&#34; 10-04 -1992&#34;,&#34; DOJ&#34;:&#34; 12-08-2013&#34;,&#34; ROLE&#34;:&#34; PROJECT ANALYST&#34;}]

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




}

}

答案 9 :(得分: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();
        }
    }

}

答案 10 :(得分:1)

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

使用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]

答案 13 :(得分:0)

您的json文件如下

enter image description here

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

答案 14 :(得分:0)

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

答案 15 :(得分:0)

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

答案 16 :(得分:-2)

您可以使用readAllBytes。

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