本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
Java中怎样使用JSON进行文件解析
zhuxiaoqiang · 156浏览 · 发布于2023-05-12 +关注

这篇文章主要介绍了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));

08cf49725d2a37529756b0b51c5bce36_2023051214354460.png

问题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;
}


相关推荐

PHP实现部分字符隐藏

沙雕mars · 1327浏览 · 2019-04-28 09:47:56
Java中ArrayList和LinkedList区别

kenrry1992 · 910浏览 · 2019-05-08 21:14:54
Tomcat 下载及安装配置

manongba · 974浏览 · 2019-05-13 21:03:56
JAVA变量介绍

manongba · 964浏览 · 2019-05-13 21:05:52
什么是SpringBoot

iamitnan · 1090浏览 · 2019-05-14 22:20:36
加载中

0评论

评论
我爱编程,我爱工作,更爱生活
小鸟云服务器
扫码进入手机网页