Java 操作 JSON 数据(6)--JSON-Java 操作 JSON 数据

JSON-Java 包是一个将 Java 对象和 JSON 文件相互转换的参考实现,演示了如何将 JSON 文档解析为Java对象,以及如何从 Java 对象生成 JSON 文档。本文介绍下 JSON-Java 的基本使用方法;文中所使用到的软件版本:Java 1.8.0_321、org.json.json 20220924。

1、JSON-Java 特点

  • 可靠且一致的结果
  • 遵守 JSON 规范
  • 易于构建、使用并可方便的引入到其他项目中
  • 不需要外部的依赖
  • 快速执行及低内存占用
  • 保持向后兼容性
  • 可在 Java 1.6 - 1.11 上使用

2、注解

JSON-Java 包目前提供了两个注解用于处理 Java 对象的序列化。

注解 作用域 说明 生效时机
@JSONPropertyIgnore
gette方法上 忽略该注解标注的属性 序列化时
@JSONPropertyName
gette方法上 指定属性对应 JSON 映射的名称 序列化时

3、具体使用

3.1、引入依赖

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20220924</version>
</dependency>

3.2、定义实体类

package com.abc.demo.json.jsonjava;

import lombok.Setter;
import lombok.ToString;
import org.json.JSONPropertyIgnore;
import org.json.JSONPropertyName;

import java.time.LocalDateTime;
import java.util.List;

@ToString
@Setter
public class Student {
    private Long id;

    private LocalDateTime createTime;

    private String name;

    private List<String> homeAddress;

    public Long getId() {
        return id;
    }

    @JSONPropertyIgnore
    public LocalDateTime getCreateTime() {
        return createTime;
    }

    public String getName() {
        return name;
    }

    @JSONPropertyName("addresses")
    public List<String> getHomeAddress() {
        return homeAddress;
    }
}

3.3、序列化及反序列化

package com.abc.demo.json.jsonjava;

import org.json.*;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class JSONJavaCase {
    private static final Logger logger = LoggerFactory.getLogger(JSONJavaCase.class);

    /**
     * 序列化
     */
    @Test
    public void serialize() {
        //使用JSONObject存储数据
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("id", 1);
        jsonObject.put("createTime", LocalDateTime.now());
        jsonObject.put("name", "小明");
        jsonObject.put("homeAddress", Arrays.asList("江苏", "上海"));
        //调用toString方法即可转为json字符串
        logger.info(jsonObject.toString());

        Student student = new Student();
        student.setId(1L);
        student.setCreateTime(LocalDateTime.now());
        student.setName("小明");
        student.setHomeAddress(Arrays.asList("江苏", "上海"));
        //普通java对象转JSONObject
        jsonObject = new JSONObject(student);
        logger.info(jsonObject.toString());

        List<Student> list = new ArrayList<>();
        list.add(student);
        //list转JSONArray
        JSONArray jsonArray = new JSONArray(list);
        logger.info(jsonArray.toString());
    }

    /**
     * 反序列化
     */
    @Test
    public void deserialize() {
        String s = "{\"addresses\":[\"江苏\",\"上海\"],\"name\":\"小明\",\"id\":1}";
        JSONTokener jsonTokener = new JSONTokener(s);
        //JSON-Java 不能从json字符串直接转成java对象,需先转成JSONObject,然后通过JSONObject的api获取数据
        JSONObject jsonObject = new JSONObject(jsonTokener);
        logger.info(jsonObject.getInt("id") + "");
        logger.info(jsonObject.getString("name"));
        logger.info(jsonObject.getJSONArray("addresses").toString());
    }
}

 

posted @ 2023-01-01 18:26  且行且码  阅读(278)  评论(0编辑  收藏  举报