纯java解析json,Java解析JSON

《java世界观》文集说明

本文集记载的所有内容均是java的学习笔记,主要重点记录概念,可能不会为每个概念列举完整的代码例子,更多代码例子请移步《java种田记》文集

本文主要涉及内容来自开课吧新职课-JavaEE开发工程师V2.0

若有错漏之处,欢迎各位指正

JSON

JSON(JavaScript Object Notation,JS对象简谱),是一种轻量级的数据交换格式,主要用于网络数据传输。

这里简单介绍一下JSON里面需要注意的JS语法,

{被花括号涵盖的部分是对象}

[被方括号涵盖的部分是数组]

对象里面的属性和值按照 键值对 key-value pair 方式存储,用:连接

键值对中 键 key 为字符串,""在js解析的时候可以省略,但在Java解析可能会报错,故不推荐省略包裹住键的双引号

键值对中的 值 value 可以为JS里面任意类型的数据

对象和数组可以互相嵌套

以下是一个例子

[

{

"id": 1,

"name": "寒天爱玉",

"ice": "少冰",

"sugar": "少糖",

"addons": [

"奶盖",

"椰果"

]

},

{

"id": 2,

"name": "奶盖乌龙",

"ice": "去冰",

"sugar": "七分糖",

"addons": [

"珍珠",

"椰果"

]

}

]

所谓解析就是在Java的对象和JSON中进行互相转换,由于目前java还没有原生的JSON解析代码,一般使用开源的JSON解析工具进行解析,常见的有google的Gson 和 阿里的FastJson。

Gson解析JSON

以之前举过的这个饮料描述为例,以下是饮料类的代码

package com.kaikeba.json;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

import java.util.Objects;

/**

* 测试用饮料类

*

* @author 蜗先生

* @date 2020/8/19

*/

public class Drink {

private int id;

private String name;

private String ice;

private String sugar;

private List addons;

public Drink(int id, String name, String ice, String sugar, List addons) {

this.id = id;

this.name = name;

this.ice = ice;

this.sugar = sugar;

this.addons = addons;

}

public Drink(int id, String name, String ice, String sugar) {

this(id, name, ice, sugar, new ArrayList<>());

}

public Drink(int id, String name, String ice, String sugar, String... addons) {

this(id, name, ice, sugar);

addAddons(addons);

}

public void addAddons(String... addon) {

addons.addAll(Arrays.asList(addon));

}

public void removeAddons(String... addon) {

for (String s : addon) {

addons.remove(s);

}

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getIce() {

return ice;

}

public void setIce(String ice) {

this.ice = ice;

}

public String getSugar() {

return sugar;

}

public void setSugar(String sugar) {

this.sugar = sugar;

}

@Override

public String toString() {

StringBuilder output = new StringBuilder(String.format("%d: %s %s %s", id, name, ice, sugar));

for (String addon : addons) {

output.append(String.format(",加%s", addon));

}

return output.toString();

}

@Override

public boolean equals(Object o) {

if (this == o) {

return true;

}

if (o == null || getClass() != o.getClass()) {

return false;

}

Drink drink = (Drink) o;

return id == drink.id;

}

@Override

public int hashCode() {

return Objects.hash(id);

}

}

以下是利用Gson实现的解析

String = new Gson().toJSON();

= new Gson().fromJson(, .class);

package com.kaikeba.json;

import com.google.gson.Gson;

import java.util.HashMap;

import java.util.List;

/**

* Gson 解析 JSON

*

* @author 蜗先生

* @date 2020/8/19

*/

public class Demo1 {

public static void main(String[] args) {

// 创建准备转换的对象

Drink drink = new Drink(1, "寒天爱玉", "少冰", "少糖", "奶盖", "椰果");

System.out.println(drink.toString());

// 转换成JSON

Gson gson = new Gson();

String json = gson.toJson(drink);

System.out.println(json);

// 将JSON转换成对象

Drink drink1 = gson.fromJson(json, Drink.class);

System.out.println(drink1.toString());

System.out.println(drink.equals(drink1));

// 转换成Map和List对象

HashMap data = gson.fromJson(json, HashMap.class);

List addons = (List) data.get("addons");

System.out.println(addons.getClass());

System.out.println(addons.get(addons.size() - 1));

}

}

运行结果如下

1: 寒天爱玉 少冰 少糖,加奶盖,加椰果

{"id":1,"name":"寒天爱玉","ice":"少冰","sugar":"少糖","addons":["奶盖","椰果"]}

1: 寒天爱玉 少冰 少糖,加奶盖,加椰果

true

class java.util.ArrayList

椰果

FastJson解析JSON

String = JSON.toJSONString();

= JSON.parseObject(, .class);

List list = JSON.parseArray(, .class);

package com.kaikeba.json;

import com.alibaba.fastjson.JSON;

import java.io.BufferedReader;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

import java.util.List;

/**

* FastJson 解析 JSON

*

* @author 蜗先生

* @date 2020/8/19

*/

public class Demo2 {

public static void main(String[] args) {

// 创建准备转换的对象

Drink drink = new Drink(1, "寒天爱玉", "少冰", "少糖", "奶盖", "椰果");

System.out.println(drink.toString());

// 转换成JSON

String json = JSON.toJSONString(drink);

System.out.println(json);

// 将JSON转换成对象 {"id":1,"name":"寒天爱玉","ice":"少冰","sugar":"少糖","addons":["奶盖","椰果"]}

Drink drink1 = JSON.parseObject("{\"id\":1,\"name\":\"寒天爱玉\",\"ice\":\"少冰\",\"sugar\":\"少糖\",\"addons\":[\"奶盖\",\"椰果\"]}", Drink.class);

System.out.println(drink1.toString());

System.out.println(drink.equals(drink1));

// 将JSON转换成多个对象

try (BufferedReader br = new BufferedReader(new FileReader("doc/test.json"))) {

StringBuilder sb = new StringBuilder();

String line;

while ((line = br.readLine()) != null) {

sb.append(line);

}

json = sb.toString();

} catch (FileNotFoundException e) {

System.out.println("请检查文件路径");

System.exit(1);

} catch (IOException ioException) {

ioException.printStackTrace();

}

System.out.println("包含了多个对象的json字符串如下:");

System.out.println(json);

List drinks = JSON.parseArray(json, Drink.class);

System.out.println("以下是转换好的多个对象:");

for (Drink obj : drinks) {

System.out.println(obj.toString());

}

}

}

以下是运行结果

1: 寒天爱玉 少冰 少糖,加奶盖,加椰果

{"ice":"少冰","id":1,"name":"寒天爱玉","sugar":"少糖"}

1: 寒天爱玉 少冰 少糖,加奶盖,加椰果

true

包含了多个对象的json字符串如下:

[ { "id": 1, "name": "寒天爱玉", "ice": "少冰", "sugar": "少糖", "addons": [ "奶盖", "椰果" ] }, { "id": 2, "name": "奶盖乌龙", "ice": "去冰", "sugar": "七分糖", "addons": [ "珍珠", "椰果" ] }]

以下是转换好的多个对象:

1: 寒天爱玉 少冰 少糖,加奶盖,加椰果

2: 奶盖乌龙 去冰 七分糖,加珍珠,加椰果

注意点:

“doc/test.json”里面的内容就是最开始的举例内容

可以发现FastJson转换成的JSON字符串是无序的,和Gson转换成的JSON字符串不同,直接转回对象可能报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值