关于 json 文件读写(java对象和json文件互相转换)的几种方法代码

发布于:2023-01-15 ⋅ 阅读:(192) ⋅ 点赞:(0)

方法一:

最近遇到了业务需求,java对象转换为json文件,json文件转换为java对象。这个需求可以拆分为:

  1. json 序列化反序列化
  2. 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"));
    }

}


网站公告

今日签到

点亮在社区的每一天
去签到