Java讀取JSON文件并將其中元素轉(zhuǎn)為JSON對(duì)象輸出的方式
Java讀取JSON文件將元素轉(zhuǎn)JSON對(duì)象輸出
1. 需求描述
本地有一個(gè)json文件,內(nèi)容為數(shù)組,數(shù)組中的每個(gè)元素都是json對(duì)象,即鍵值形式
如文件test.json
[
{"123":"libai","245":"zhangfei","444":"qipa"},
{"133":"libi","205":"zhanfei","494":"qipai"}
]
現(xiàn)在想要將test.json文件中的每個(gè)元素讀出來(lái)并轉(zhuǎn)為json對(duì)象輸出
2. 所需依賴
在pom中添加依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
3. 代碼
完整代碼內(nèi)容如下
package com.xiucong.vihicle;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
/**
* @func:
* @author: LiBai
* @version: v1.0
* @createTime: 2025/4/15 15:14
*/
public class ExcelInsertRecordsController {
public static void main(String[] args) {
// JSON文件路徑
String filePath = "D:\\xiucong\\test.json";
File file = new File(filePath);
try {
// 讀取文件內(nèi)容為字符串
String content = new String(Files.readAllBytes(Paths.get(file.getPath())));
// 將字符串解析為JSONArray對(duì)象
JSONArray jsonArray = JSON.parseArray(content);
// 打印數(shù)組內(nèi)容,以驗(yàn)證結(jié)果
for (int i = 0; i < jsonArray.size(); i++) {
// System.out.println(jsonArray.get(i));
JSONObject obj = (JSONObject) jsonArray.get(i);
System.out.println(i+"==============================================>");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Java讀取JSON文件并解析為JSON對(duì)象的拓展
以下是一個(gè)詳細(xì)的Java讀取JSON文件并轉(zhuǎn)換為JSON對(duì)象的實(shí)現(xiàn)步驟,涵蓋不同場(chǎng)景和常用庫(kù)(如Jackson、Gson、JSON-java)的使用方法:
1. 準(zhǔn)備工作
依賴庫(kù)選擇
Jackson:高性能,Spring Boot默認(rèn)集成(推薦)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.0</version>
</dependency>
Gson:Google的JSON庫(kù),輕量級(jí)
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
JSON-java:官方JSON庫(kù)(功能較基礎(chǔ))
// JDK 內(nèi)置(JDK 11+)
// 或手動(dòng)引入:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20231013</version>
</dependency>
2. 使用Jackson解析JSON文件
步驟1:讀取文件內(nèi)容
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ReadJsonFile {
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
try {
// 從文件路徑讀取JSON
JsonNode rootNode = mapper.readTree(new File("data.json"));
// 直接輸出整個(gè)JSON對(duì)象
System.out.println(rootNode.toPrettyString());
// 訪問(wèn)具體字段
String name = rootNode.get("name").asText();
int age = rootNode.get("age").asInt();
System.out.println("Name: " + name + ", Age: " + age);
} catch (IOException e) {
e.printStackTrace();
}
}
}
步驟2:反序列化為Java對(duì)象
定義Java類:
public class User {
private String name;
private int age;
private List<String> hobbies;
// 必須有無(wú)參構(gòu)造器和getter/setter
// ...
}
解析代碼:
User user = mapper.readValue(new File("data.json"), User.class);
System.out.println(user.getHobbies());
3. 使用Gson解析JSON文件
步驟1:讀取并解析
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
public class GsonExample {
public static void main(String[] args) {
Gson gson = new Gson();
try {
// 讀取文件內(nèi)容為字符串
String jsonStr = Files.readString(Paths.get("data.json"));
// 轉(zhuǎn)換為JsonObject
JsonObject jsonObject = JsonParser.parseString(jsonStr).getAsJsonObject();
// 訪問(wèn)字段
String name = jsonObject.get("name").getAsString();
System.out.println("Name: " + name);
// 反序列化為對(duì)象
User user = gson.fromJson(jsonStr, User.class);
System.out.println(user.getAge());
} catch (IOException e) {
e.printStackTrace();
}
}
}
4. 使用JSON-java(org.json)解析
import org.json.JSONObject;
import org.json.JSONTokener;
public class JsonOrgExample {
public static void main(String[] args) {
try (FileReader reader = new FileReader("data.json")) {
// 從文件讀取JSON
JSONObject jsonObject = new JSONObject(new JSONTokener(reader));
// 訪問(wèn)字段
String name = jsonObject.getString("name");
JSONArray hobbies = jsonObject.getJSONArray("hobbies");
System.out.println("Hobbies: " + hobbies.toString(2)); // 格式化輸出
} catch (Exception e) {
e.printStackTrace();
}
}
}
5. 處理復(fù)雜JSON結(jié)構(gòu)
示例JSON文件(data.json)
{
"name": "Alice",
"age": 30,
"hobbies": ["Reading", "Hiking"],
"address": {
"city": "Shanghai",
"postcode": "200000"
}
}
訪問(wèn)嵌套對(duì)象(Jackson示例)
JsonNode addressNode = rootNode.get("address");
String city = addressNode.get("city").asText();
遍歷數(shù)組
JsonNode hobbies = rootNode.get("hobbies");
hobbies.forEach(hobby -> System.out.println(hobby.asText()));
6. 異常處理與最佳實(shí)踐
文件路徑問(wèn)題
- 使用絕對(duì)路徑或相對(duì)路徑(相對(duì)于項(xiàng)目根目錄)
- 文件不存在時(shí)捕獲
FileNotFoundException
JSON格式校驗(yàn)
- 確保JSON文件語(yǔ)法正確(可用在線工具如JSONLint驗(yàn)證)
性能優(yōu)化
- 大文件使用Jackson的流式API(
JsonParser)逐行解析 - 復(fù)用
ObjectMapper實(shí)例(線程安全)
7. 完整代碼示例(Jackson版)
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.IOException;
public class JsonReader {
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
try {
JsonNode root = mapper.readTree(new File("data.json"));
// 輸出完整JSON
System.out.println("完整JSON內(nèi)容:\n" + root.toPrettyString());
// 提取嵌套字段
String city = root.get("address").get("city").asText();
System.out.println("城市: " + city);
// 遍歷數(shù)組
System.out.println("愛(ài)好:");
root.get("hobbies").forEach(hobby ->
System.out.println(" - " + hobby.asText())
);
} catch (IOException e) {
System.err.println("讀取文件失敗: " + e.getMessage());
}
}
}
總結(jié)
- 推薦庫(kù):優(yōu)先選擇 Jackson(性能好、功能全)或 Gson(簡(jiǎn)潔易用)
- 關(guān)鍵步驟:讀取文件 → 解析為JSON對(duì)象 → 按需提取數(shù)據(jù)
- 適用場(chǎng)景:配置文件解析、API響應(yīng)處理、數(shù)據(jù)導(dǎo)入導(dǎo)出等
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot實(shí)現(xiàn)異步消息處理的代碼示例
在現(xiàn)代應(yīng)用程序中,異步消息處理是一項(xiàng)至關(guān)重要的任務(wù)。它可以提高應(yīng)用程序的性能、可伸縮性和可靠性,同時(shí)也可以提供更好的用戶體驗(yàn),本文將介紹如何使用Spring Boot實(shí)現(xiàn)異步消息處理,并提供相應(yīng)的代碼示例2023-06-06
使用springmvc運(yùn)行流程分析,手寫(xiě)spring框架嘗試
這篇文章主要介紹了使用springmvc運(yùn)行流程分析,手寫(xiě)spring框架嘗試,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
IDEA使用JDBC安裝配置jar包連接MySQL數(shù)據(jù)庫(kù)
這篇文章介紹了IDEA使用JDBC安裝配置jar包連接MySQL數(shù)據(jù)庫(kù)的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01
java實(shí)現(xiàn)微信掃碼登錄第三方網(wǎng)站功能(原理和代碼)
為避免繁瑣的注冊(cè)登陸,很多平臺(tái)和網(wǎng)站都會(huì)實(shí)現(xiàn)三方登陸的功能,增強(qiáng)用戶的粘性。這篇文章主要介紹了java實(shí)現(xiàn)微信掃碼登錄第三方網(wǎng)站功能(原理和代碼),避免做微信登錄開(kāi)發(fā)的朋友們少走彎路2022-12-12
解決nacos啟動(dòng)報(bào)錯(cuò)Server check fail, please che
這篇文章主要介紹了nacos啟動(dòng) Server check fail, please check server localhost ,port 9848 is available的錯(cuò)誤原因以及解決方法,需要的朋友可以參考下2023-09-09

