Java中怎样使用JSON进行文件解析

 更新时间:2023年05月12日 14:40:42   作者:鸣筝鸣筝  
这篇文章主要介绍了Java中怎样使用JSON进行文件解析问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

一、什么是JSON

JSON是一种轻量级的数据交换格式。它基于ECMAScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。

简洁和清晰的层次结构是的JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

JSON语法

使用大括号{ }保存对象,每个对象由若干个数据组成;

每个数据由key:value键值对组成;

数据之间使用逗号分隔;

使用 \ 进行特殊字符的转义

例如:

{"reason":
"success","result":
[{"id":1,"firstLetter":"A","brandName":"奥迪","brandLogo":"http"},
{"id":2,"firstLetter":"A","brandName":"雷克萨斯","brandLogo":"http"},
{"id":3,"firstLetter":"A","brandName":"奔驰","brandLogo":"ghjvh"}]

二、JSON的用途

JSON作为一种轻量级的数据格式,它的主要用途是在计算机系统之间进行数据的传递。

JSON作为数据传输的格式,有几个显著的优点:

(1)JSON只允许使用UTF-8编码,不存在编码问题;

(2)JSON内容仅包含key-value键值对,格式简单,不存在冗余结构,是一种轻量级结构;

(3)浏览器内置JSON支持,如果把数据用JSON发送给浏览器,可以用JavaScript直接处理;

所以,开发web应用的时候,使用JSON作为数据传输,在浏览器端非常方便。因为JSON非常适合JavaScript处理,所以,绝大多数REST API都选择JSON作为数据传输格式。

在使用Java进行应用程序的开发中,可能会遇到“将Java对象转换成JSON格式”或者“将JSON格式的数据转换成Java对象”的需求。

常用于解析JSON的第三方库有

  • Jackson
  • Gson
  • Fastjson

三、如何应用JSON

在应用JSON时我们最常用Fastjson这个库,Fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化微JSON字符串,也可以从JSON字符串反序列化到JavaBean。

Fastjson主要使用JSON、jsonObject、jsonArrary三个类。其中JSONArray和JSONObject继承自JSON。

JSON类

JSON类的作用主要是用于原始转换,常用方法有:

Java对象“序列化“(转换)为JSON字符串。

使用:JSON.toJSONString(Object object),如果需要定义json中的key,可以使用@JSONField注解在成员变量进行设置

//实体数据
PoliceStation ps1=new PoliceStation();
		ps1.setName("电子城派出所");
		ps1.setAddr("雁塔区电子二路");
		ps1.setTel("1234567890");
		//序列化:将Java对象转换成json格式的数据
		String s1=JSON.toJSONString(ps1);
		System.out.println(s1);

将JSON字符串反序列化为Java对象

JSON.parseObject(String text)

//反序列化:将json格式的字符串转换成Java对象
		String s2="{\"addr\":\"雁塔区电子二路\",
                        \"name\":\"电子城派出所\",
                         \"tel\":\"1234567890\"}\r\n }";
		PoliceStation ps2= JSON.parseObject(s2,PoliceStation.class);
		System.out.println(ps2);

JSON.parseArray(String text)

// json格式数据
String jsonStr = "[{ \"name\": \"文保分局沪东高校派出所\", \"addr\": \"中山北一路801号\", 			\"tel\": \"22027732\" 		}, { 			\"name\": \"文保分局沪西高校派出所\", 			\"addr\": \"芙蓉江路55号\", 			\"tel\": \"62751704\" 		}, { 			\"name\": \"水上公安局吴淞水上派出所\", 			\"addr\": \"淞浦路187号\", 			\"tel\": \"56671442\" 		}, { 			\"name\": \"水上公安局杨浦水上派出所\", 			\"addr\": \"杨树浦路1291号\", 			\"tel\": \"65898004\" 		}, { 			\"name\": \"水上公安局外滩水上派出所\", 			\"addr\": \"中山东二路8弄3号\", 			\"tel\": \"63305388\" 		}, { 			\"name\": \"水上公安局石洞口水上派出所\", 			\"addr\": \"盛石路18号\", 			\"tel\": \"56152176\" 		}, { 			\"name\": \"轨道分局上海火车站站派出所\", 			\"addr\": \"共和新路2838号\", 			\"tel\": \"56650472\" 		}, { 			\"name\": \"轨道分局徐家汇站派出所\", 			\"addr\": \"沪闵路6707号\", 			\"tel\": \"63189188*70246\" 		}, { 			\"name\": \"轨道分局人民广场站派出所\", 			\"addr\": \"南京西路19号\", 			\"tel\": \"63189188*76369\" 		}, { 			\"name\": \"轨道分局陆家嘴站派出所\", 			\"addr\": \"龙阳路1990号乙\", 			\"tel\": \"63189188*27132\" 		}, { 			\"name\": \"轨道分局宜山路站派出所\", 			\"addr\": \"零陵路668号\", ... \"崇明县公安局新村派出所\", 			\"addr\": \"新村乡新中村新跃160号\", 			\"tel\": \"59650598\" 		}, { 			\"name\": \"崇明县公安局新海派出所\", 			\"addr\": \"新海农场场部北侧\", 			\"tel\": \"59655712\" 		}, { 			\"name\": \"崇明县公安局长征派出所\", 			\"addr\": \"长征农场派出所生活区长征农场场部\", 			\"tel\": \"59311459\" 		}, { 			\"name\": \"崇明县公安局长江派出所\", 			\"addr\": \"东风农场林风公路1579号\", 			\"tel\": \"59641914\" 		}, { 			\"name\": \"崇明县公安局东旺派出所\", 			\"addr\": \"前哨农场前哨公路18号\", 			\"tel\": \"59471109\" 		}, { 			\"name\": \"崇明县公安局东滩湿地保护区治安派出所\", 			\"addr\": \"陈家镇瀛陈公路崇明县团结沙\", 			\"tel\": \"59404611\" 		}, { 			\"name\": \"崇明县公安局长兴派出所\", 			\"addr\": \"长兴镇海舸路659号\", 			\"tel\": \"56851431\" 		}, { 			\"name\": \"崇明县公安局横沙派出所\", 			\"addr\": \"民东路1588号\", 			\"tel\": \"24060670\" 		}]";
List<PoliceStation> stationList = JSON.parseArray(jsonStr, PoliceStation.class);
for(PoliceStation ps : stationList) {
    System.out.println("警局名称:" + ps.getName());
    System.out.println("警局地址:" + ps.getAddr());
    System.out.println("联系电话:" + ps.getTel());
}

常见问题

问题1:FastJson默认过滤null值,不显示null字段

Map<String, Object> map = new HashMap<String, Object>(){
    {
        put("age", 20);
        put("name", "灰灰");
        put("sex", null);
    }
};
System.out.println(JSONObject.toJSONString(map));
//输出结果
{"name:"灰灰","age":20}

解决方法:转换成JSON字符串时,使用Feature枚举值进行设置

Map<String, Object> map = new HashMap<String, Object>(){
    {
        put("age", 20);
        put("name", "灰灰");
        put("sex", null);
    }
};
// 使用Feature类型的枚举值进行设置
System.out.println(JSONObject.toJSONString(map,Feature.WriteMapNullValue));

问题2:控制JSON的字段顺序

//实体类
public class PoliceStation {
	private String name;
	private String addr;
	private String tel;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
	public String getTel() {
		return tel;
	}
	public void setTel(String tel) {
		this.tel = tel;
	}
}
//测试类
PoliceStation ps = new PoliceStation();
ps.setName("电子城派出所");
ps.setAddr("雁塔区电子二路343号");
ps.setTel("13324554332");
System.out.println(JSON.toJSONString(ps));
//输出结果
{"addr":"雁塔区电子二路343号","name":"电子城派出所","tel":"13324554332"}

解决方法:输出结果与字段定义顺序不一致,需要在定义实体类字段时,使用@JSONField注解的ordinal属性进行顺序配置

import com.alibaba.fastjson2.annotation.JSONField;
public class PoliceStation {
	@JSONField(ordinal = 1)
	private String name;
	@JSONField(ordinal = 2)
	private String addr;
	@JSONField(ordinal = 3)
	private String tel;
}

问题3:控制JSON的Date字段格式

//实体类
// 订单类
public class Order{
    // 订单编号
	private String orderId;
    // 创建日期
	private LocalDateTime creationTime;
	public Order() {
		this.orderId = UUID.randomUUID().toString();
		this.creationTime = LocalDateTime.now();
	}
	public String getOrderId() {
		return orderId;
	}
	public void setOrderId(String orderId) {
		this.orderId = orderId;
	}
	public LocalDateTime getCreationTime() {
		return creationTime;
	}
	public void setCreationTime(LocalDateTime creationTime) {
		this.creationTime = creationTime;
	}
}
//测试类
public class Test {
	public static void main(String[] args) {
		Order order1 = new Order();
		String json = JSON.toJSONString(order1);
		System.out.println(json);
	}
}
//输出结果
{"creationTime":"2022-07-10 19:39:07.377","orderId":"dbee4f0c-ced7-463f-b19b-c83234cbd5b0"}

解决方法:输出日期字段时,默认格式不符合需求时,可以在定义实体类的Date字段,使用@jsonFie注解的format属性进行格式配置

// 订单类
public class Order{
	// 订单编号
	private String orderId;
	// 创建日期
	@JSONField(format = "yyyy-MM-dd HH:mm:ss")
	private LocalDateTime creationTime;
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • JDK8配置环境变量的bat文件的详细教程

    JDK8配置环境变量的bat文件的详细教程

    这篇文章主要介绍了JDK8配置环境变量的bat文件,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • chatgpt java环境调用源码实现demo

    chatgpt java环境调用源码实现demo

    这篇文章主要介绍了chatgpt java环境调用源码实现demo,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • Java CompletableFuture实现多线程异步编排

    Java CompletableFuture实现多线程异步编排

    这篇文章主要为大家介绍了Java CompletableFuture实现多线程异步编排,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Nacos Discovery服务治理解决方案

    Nacos Discovery服务治理解决方案

    DiscoveryClient是专门负责服务注册和发现的,我们可以通过它获取到注册到注册中心的所有服务,这篇文章主要介绍了Nacos Discovery服务治理,需要的朋友可以参考下
    2022-11-11
  • Java的编译时错误和运行时错误问题

    Java的编译时错误和运行时错误问题

    这篇文章主要介绍了Java的编译时错误和运行时错误问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Java返回分页结果集的封装代码实例

    Java返回分页结果集的封装代码实例

    这篇文章主要介绍了java返回分页结果集的封装代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Java中Arrays的介绍及使用方法示例

    Java中Arrays的介绍及使用方法示例

    这篇文章主要给大家介绍了关于Java中Arrays及使用方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 浅谈一下数据库连接池Druid德鲁伊

    浅谈一下数据库连接池Druid德鲁伊

    数据库连接池就是一个容器持有多个数据库连接,当程序需要操作数据库的时候直接从池中取出连接,使用完之后再还回去,和线程池一个道理,需要的朋友可以参考下
    2023-05-05
  • Java中YYYY-MM-dd与yyyy-MM-dd的区别及跨年问题

    Java中YYYY-MM-dd与yyyy-MM-dd的区别及跨年问题

    YYYY-MM-dd可能会导致跨年周的日期被归属到错误的年份, yyyy-MM-dd总是表示实际的日历年份,无论日期所在的周是否跨年,本文就来介绍一下两者的区别,感兴趣的可以了解一下
    2024-01-01
  • java中全排列的生成算法汇总

    java中全排列的生成算法汇总

    本文给大家汇总介绍了常见的6种全排列的生成算法,包括字典序法、递增进位数制法、递减进位数制法、邻位交换法、递归类算法、元素增值法,有需要的小伙伴可以参考下
    2015-07-07

最新评论