如何使用简单的 JSON 库将 json 文件读入 java
Posted
技术标签:
【中文标题】如何使用简单的 JSON 库将 json 文件读入 java【英文标题】:How to read json file into java with simple JSON library 【发布时间】: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 数组。我希望有人可以帮助我解决我的代码中缺少的代码行。
谢谢
【问题讨论】:
【参考方案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
。然后您可以从数组中获取JSONObject
s ...
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 文档说JSONArray
是java.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;
导入它以上是关于如何使用简单的 JSON 库将 json 文件读入 java的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Java 库将标记的 YAML 对象转换为 JSON 对象?
使用 pyspark,如何将文件中单行的多个 JSON 文档读入数据框?
java - 如何使用Java中的Volley库将JSON api数据放入recyclerview?