凯发娱发k8

java使用json进行文件解析的方法 -凯发娱发k8

2023-11-13

专为编程打造,自动写代码机器人,免费开通

今天小编给大家分享的是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 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 map = new hashmap(){
    {
        put("age", 20);
        put("name", "灰灰");
        put("sex", null);
    }
};
system.out.println(jsonobject.tojsonstring(map));
//输出结果
{"name:"灰灰","age":20}

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

map map = new hashmap(){
    {
        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;
}

关于java使用json进行文件解析的方法就分享到这里了,希望以上内容可以对大家有一定的参考价值,可以学以致用。如果喜欢本篇文章,不妨把它分享出去让更多的人看到。

网站地图