方法一:
最近遇到了业务需求,java对象转换为json文件,json文件转换为java对象。这个需求可以拆分为:
- json 序列化反序列化
- java IO
json 序列化反序列化我们使用 alibaba 的 fastjson,很好用。
依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cn.qi.XXX</groupId>
<artifactId>XXX_springBoot</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!-- fastjson https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.56</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
</dependencies>
</project>
代码
实体类 Person(使用了lombok依赖)
三个 lombok 注解必须加,如果未使用 lombok,请在此实体类加 setter & getter,全参构造方法,无参构造方法。(方法测试写在下面的demo中)
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
private Integer id;
private String name;
private Integer age;
//模拟对象转json测试
/*public static void main(String[] args) throws IOException{
String name ="test-json.json";
String path ="C:\\Users\\Administrator\\Desktop";
String finalPath = path +"/"+name;
List<Object> ops = new ArrayList<>(100);
for(int i=0;i<3;i++){
Person op = new Person();
if(i==0){
op.setId(1);
op.setName("龟仙人");
op.setAge(100);
}
if(i==1){
op.setId(2);
op.setName("孙悟空");
op.setAge(25);
}
if(i==2){
op.setId(3);
op.setName("库林");
op.setAge(25);
}
ops.add(op);
}
object2JsonFile(finalPath,ops);
}*/
//json 转对象
public static void main(String[] args) {
String name ="test-json.json";
String path ="C:\\Users\\Administrator\\Desktop";
String finalPath = path +"/"+name;
jsonFile2Object(finalPath,Person.class);
}
/**
* Object 转换为 json 文件
*
* @param finalPath finalPath 是绝对路径 + 文件名,请确保欲生成的文件所在目录已创建好
* @param objects 需要被转换的集合 List<Object>
*/
public static void object2JsonFile(String finalPath, List<Object> objects) throws IOException {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(finalPath), StandardCharsets.UTF_8);
for (int j=0;j<objects.size();j++) {
JSONObject jsonObject = (JSONObject) JSON.toJSON(objects.get(j));
osw.write(jsonObject.toJSONString());
System.out.println(jsonObject.toJSONString());
}
osw.flush();
osw.close();
}
/**
* json 文件转换为 Object
*
* @param finalPath finalPath 是绝对路径 + 文件名,请确保欲生成的文件所在目录已创建好
* @param targetClass 需要被转换的 json 对应的目标类
* @param <T> 需要被转换的 json 对应的目标类
* @return 解析后的 Object
*/
public static <T> T jsonFile2Object(String finalPath, Class<T> targetClass) {
String jsonString;
File file = new File(finalPath);
try {
FileInputStream inputStream = new FileInputStream(file);
int size = inputStream.available();
byte[] buffer = new byte[size];
inputStream.read(buffer);
inputStream.close();
jsonString = new String(buffer, StandardCharsets.UTF_8);
System.out.println(jsonString.getClass());
String[] lists= jsonString.split("}");
for(int o =0;o<lists.length;o++){
System.out.println(lists[o]);
T object = JSON.parseObject(lists[o]+"}", targetClass);
System.out.println(object.toString());
}
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("IO exception");
}
return null;
}
}
方法二:
依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.2</version>
</dependency>
java对象转成json字符串(保存到文件)
普通转换(String jsonStr = “{“username”:“张三”,“password”:“123456”}”;)
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
public class User {
private String username;
private String passwrod;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPasswrod() {
return passwrod;
}
public void setPasswrod(String passwrod) {
this.passwrod = passwrod;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", passwrod='" + passwrod + '\'' +
'}';
}
public static void toJson() throws IOException {
//Java对象转换成JSON字符串
User user = new User();
user.setUsername("路飞");
user.setPasswrod("666666666666666");
ObjectMapper mapper = new ObjectMapper();
String jsonStr = mapper.writeValueAsString(user);
System.out.println(jsonStr);
//把转好的数据保存到文件中
mapper.writeValue(new File("a.json"), user);
}
public static void main(String[] args) throws IOException {
toBean();
}
public static void toBean() throws JsonProcessingException {
String jsonStr = "{\"username\":\"张三\",\"passwrod\":\"123456\"}";
//保证你提供的Java类的属性名和类型以及层级结构和json字符串一一对应即可。
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(jsonStr, User.class);
System.out.println(user);
}
}
方法三:
(Java 读取 JSON 文件转成 Map 对象)
Json 采用 key - value 格式,作为配置文件,是一个很好的选择
JSON 是一种文本形式的数据交换格式,它比XML更轻量、比二进制容易阅读和编写,调式也更加方便
读取文件相对读取数据库,效率更高,待读取的外部 JSON 文件。
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Map;
import com.google.gson.Gson;
public class ReadJsonFile {
public static Map readJsonFile(String fileName) {
Gson gson = new Gson();
String json = "";
try {
File file = new File(fileName);
Reader reader = new InputStreamReader(new FileInputStream(file), "utf-8");
int ch = 0;
StringBuffer buffer = new StringBuffer();
while ((ch = reader.read()) != -1) {
buffer.append((char) ch);
}
reader.close();
json = buffer.toString();
System.out.println(json);
return gson.fromJson(json,Map.class);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println(readJsonFile("C:\\Users\\Administrator\\Desktop\\test-json.json"));
}
}