当前位置:首页 > 技术 > 正文内容

JSON数据转换完全指南:序列化和反序列化实战

访客 技术 2026年7月15日 1

概述

在Java开发中,经常需要在对象和JSON字符串之间进行转换。这种转换过程在Java中被称为序列化和反序列化。序列化是指将Java对象转换为JSON字符串的过程,而反序列化则是将JSON字符串还原为Java对象的过程。

本文将详细介绍如何使用阿里巴巴开源的fastjson库完成这些操作,并展示如何自定义序列化策略以及处理日期类型数据的格式化。

环境准备

首先需要在项目中引入fastjson依赖包。推荐使用1.1.33或更高版本,同时确保项目中已包含必要的依赖。

实体类定义

创建一个用于测试的实体类,假设我们需要处理位置信息数据:

public class LocationInfo {
    
    private String locationName;
    private Float elevation;
    private Float longitude;
    private Float latitude;
    
    // 必须提供getter方法,否则无法序列化
    public String getLocationName() {
        return locationName;
    }
    
    public void setLocationName(String locationName) {
        this.locationName = locationName;
    }
    
    public Float getElevation() {
        return elevation;
    }
    
    public void setElevation(Float elevation) {
        this.elevation = elevation;
    }
    
    public Float getLongitude() {
        return longitude;
    }
    
    public void setLongitude(Float longitude) {
        this.longitude = longitude;
    }
    
    public Float getLatitude() {
        return latitude;
    }
    
    public void setLatitude(Float latitude) {
        this.latitude = latitude;
    }
}

重要提示:fastjson在序列化时只会处理有getter方法的属性,因此实体类必须为每个需要转换的字段提供getter方法。

基础序列化与反序列化

fastjson提供了简洁的API来完成对象和JSON字符串之间的互转。

完整示例代码

import com.alibaba.fastjson.JSONObject;

public class JsonConversionDemo {
    
    public static void main(String[] args) {
        // 创建测试对象
        LocationInfo location = new LocationInfo();
        location.setLocationName("测试地点");
        location.setElevation(100.5f);
        location.setLatitude(39.9042f);
        location.setLongitude(116.4074f);
        
        // 序列化操作:将对象转换为JSON字符串
        // 默认情况下,所有非空字段都会被转换为JSON
        String jsonString = JSONObject.toJSONString(location);
        System.out.println("序列化结果:" + jsonString);
        
        // 反序列化操作:将JSON字符串转换为对象
        LocationInfo parsedLocation = JSONObject.parseObject(
            jsonString, 
            LocationInfo.class
        );
        System.out.println("反序列化后地点名称:" + parsedLocation.getLocationName());
        System.out.println("反序列化后经度:" + parsedLocation.getLongitude());
    }
}

上述代码的输出结果类似于:

序列化结果:{"elevation":100.5,"latitude":39.9042,"locationName":"测试地点","longitude":116.4074}
反序列化后地点名称:测试地点
反序列化后经度:116.4074

自定义序列化策略

在实际开发中,有时只需要将对象的某些特定字段转换为JSON,而不是全部字段。fastjson提供了SimplePropertyPreFilter类来实现这种需求。

选择性序列化示例

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SimplePropertyPreFilter;

public class CustomSerializationDemo {
    
    public static void main(String[] args) {
        LocationInfo location = new LocationInfo();
        location.setLocationName("指定地点");
        location.setElevation(200.0f);
        location.setLatitude(31.2304f);
        location.setLongitude(121.4737f);
        
        // 创建过滤器,只序列化locationName和elevation两个属性
        SimplePropertyPreFilter filter = new SimplePropertyPreFilter(
            LocationInfo.class, 
            "locationName", 
            "elevation"
        );
        
        String filteredJson = JSONObject.toJSONString(location, filter);
        System.out.println("过滤后的JSON:" + filteredJson);
        
        // 反序列化过滤后的JSON字符串
        LocationInfo restored = JSONObject.parseObject(
            filteredJson, 
            LocationInfo.class
        );
        System.out.println("恢复后的经度值:" + restored.getLongitude());
    }
}

运行结果:

过滤后的JSON:{"elevation":200,"locationName":"指定地点"}
恢复后的经度值:null

可以看到,通过过滤器只有指定的字段被序列化,反序列化时未包含的字段则为null。

日期类型处理

日期是常见的数据类型,fastjson对日期处理提供了多种灵活的格式化方案。

日期序列化示例

import java.util.Date;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;

public class DateSerializationDemo {
    
    public static void main(String[] args) {
        Date currentDate = new Date();
        
        // 方式一:默认转换为毫秒时间戳
        String timestampFormat = JSON.toJSONString(currentDate);
        System.out.println("毫秒时间戳格式:" + timestampFormat);
        
        // 方式二:使用默认日期时间格式 "yyyy-MM-dd HH:mm:ss"
        String standardFormat = JSON.toJSONString(
            currentDate, 
            SerializerFeature.WriteDateUseDateFormat
        );
        System.out.println("标准格式:" + standardFormat);
        
        // 方式三:自定义日期格式
        String customFormat = JSON.toJSONStringWithDateFormat(
            currentDate, 
            "yyyy-MM-dd", 
            SerializerFeature.WriteDateUseDateFormat
        );
        System.out.println("自定义格式:" + customFormat);
    }
}

输出结果示例:

毫秒时间戳格式:1704067200000
标准格式:2024-01-01 12:00:00
自定义格式:2024-01-01

总结

fastjson作为高性能的JSON处理库,提供了丰富的序列化反序列化功能。通过本文介绍的基础API、过滤器机制和日期格式化选项,开发者可以灵活应对各种JSON数据转换场景。在实际应用中,应根据具体需求选择合适的序列化策略,以达到最佳的性能和功能平衡。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。