JAVA中的四种JSON解析方式详解

我们在日常开发中少不了和JSON数据打交道,那么我们来看看JAVA中常用的JSON解析方式。

1、JSON官方 脱离框架使用

2、GSON

3、FastJSON 有问题

4、jackson 常用

JSON操作涉及到的类:

public class Student {

    private int id;
private String name;
private int age;
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public Student() {
super();
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
public class Grade {

    private int id;
private String name;
private ArrayList<Student> stus;
public Grade(int id, String name, ArrayList<Student> stus) {
super();
this.id = id;
this.name = name;
this.stus = stus;
}
public Grade() {
super();
}
@Override
public String toString() {
return "Grade [id=" + id + ", name=" + name + ", stus=" + stus + "]";
}
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 ArrayList<Student> getStus() {
return stus;
}
public void setStus(ArrayList<Student> stus) {
this.stus = stus;
} }

JSON官方的解析最具有通用性,但是有点小麻烦。

package cn.itcast.test;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.junit.Test; import java.util.ArrayList; public class JsonTest {
@Test
public void test1() {
String json1 = "{'id':1,'name':'JAVAEE-1703','stus':[{'id':101,'name':'刘一','age':16},{'id':102,'name':'刘二','age':23}]}";
//数组
String json2 = "['北京','天津','杭州']";
// JSONObject jObject = new JSONObject(json1); JSONObject jsonObject = JSONObject.fromObject(json1);
// System.out.println(jsonObject);
// Map<String,Object> map = jsonObject;
// for (Map.Entry<String, Object> entry : map.entrySet()) {
// System.out.println(entry.getKey());
// System.out.println(entry.getValue());
// System.out.println("=========");
// } Grade grade = new Grade();
grade.setId(jsonObject.getInt("id"));
grade.setName(jsonObject.getString("name"));
ArrayList<Student> students = new ArrayList<>();
grade.setStus(students); JSONArray stus = jsonObject.getJSONArray("stus");
for (Object o : stus) {
// System.out.println(o);
JSONObject jsonObject1 = JSONObject.fromObject(o);
Student student = new Student(jsonObject1.getInt("id"), jsonObject1.getString("name"), jsonObject1.getInt("age"));
grade.getStus().add(student);
} System.out.println(grade); }
@Test
public void test2(){
JSONObject jsonObject = new JSONObject();
jsonObject.put("id", 100);
jsonObject.put("name", "二弟");
jsonObject.put("age", 30); JSONObject jsonObject1 = new JSONObject();
jsonObject1.put("id", 102);
jsonObject1.put("name", "狗蛋");
jsonObject1.put("age", 10); JSONArray jsonArray = new JSONArray();
jsonArray.add(jsonObject);
jsonArray.add(jsonObject1);
System.out.println(jsonArray); }
}

GSON解析是谷歌的,也比较好用


public class GSONTest { //解析
@Test
public void test1() {
// 对象嵌套数组嵌套对象
String json1 = "{'id':1,'name':'JAVAEE-1703','stus':[{'id':101,'name':'刘一','age':16}]}";
// 数组
String json2 = "['北京','天津','杭州']"; Gson gson=new Gson();
//1、
//解析对象:第一个参数:待解析的字符串 第二个参数结果数据类型的Class对象
Grade grade=gson.fromJson(json1, Grade.class);
System.out.println(grade); //2、
//解析数组要求使用Type
ArrayList<String> list=gson.fromJson(json2,
new TypeToken<ArrayList<String>>(){}.getType());
System.out.println(list);
}
//生成
@Test
public void test2(){
ArrayList<Student> list=new ArrayList<>();
for(int i=1;i<3;i++){
list.add(new Student(101+i, "码子", 20+i));
}
Grade grade=new Grade(100001,"张三", list);
Gson gson=new Gson();
//将对象转换为诶JSON格式字符串
String json=gson.toJson(grade);
System.out.println(json); }
}

FastJSON是阿里巴巴的产品,效率最高

public class FASTJson {

    //解析
@Test
public void test1() {
// 对象嵌套数组嵌套对象
String json1 = "{'id':1,'name':'JAVAEE-1703','stus':[{'id':101,'name':'刘铭','age':16}]}";
// 数组
String json2 = "['北京','天津','杭州']";
//1、
//静态方法
Grade grade=JSON.parseObject(json1, Grade.class);
System.out.println(grade);
//2、
List<String> list=JSON.parseArray(json2, String.class);
System.out.println(list);
}
//生成
@Test
public void test2(){
ArrayList<Student> list=new ArrayList<>();
for(int i=1;i<3;i++){
list.add(new Student(101+i, "码子", 20+i));
}
Grade grade=new Grade(100001,"张三", list);
String json=JSON.toJSONString(grade);
System.out.println(json);
}
}

jackSon解析JSON,SpringMVC内置的解析器就是这个

package cn.itcast.test;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test; import java.io.IOException;
import java.util.ArrayList;
import java.util.List; public class jackSonTest {
@Test
public void test1() throws IOException {
// 对象嵌套数组嵌套对象
String json1 = "{\"id\":1,\"name\":\"JAVAEE-1703\",\"stus\":[{\"id\":101,\"name\":\"刘一\",\"age\":16}]}";
// 数组
String json2 = "[\"北京\",\"天津\",\"杭州\"]"; ObjectMapper mapper = new ObjectMapper();
Grade grade = mapper.readValue(json1, Grade.class);
System.out.println(grade); List<String> list = mapper.readValue(json2, new TypeReference<List<String>>() {
});
System.out.println(list); } @Test
public void test2() throws JsonProcessingException {
ArrayList<Student> students = new ArrayList<>();
for (int i = 0; i < 3; i++) {
students.add(new Student(100 + i, "二稿" + i, 1000 + i)); }
Grade grade = new Grade(22, "语文", students);
// System.out.println(grade);
ObjectMapper objectMapper = new ObjectMapper();
String s = objectMapper.writeValueAsString(grade);
System.out.println(s);
}
}

除了JSON官方的对类没有要求,剩下的都要求是标准的类,否则无法解析,因为都用到了反射。

JAVA中的四种JSON解析方式详解的更多相关文章

  1. thinkphp四种url访问方式详解

    本文实例分析了thinkphp的四种url访问方式.分享给大家供大家参考.具体分析如下: 一.什么是MVC thinkphp的MVC模式非常灵活,即使只有三个中和一个也可以运行. M -Model 编 ...

  2. Java 异步编程 (5 种异步实现方式详解)

    ​ 同步操作如果遇到一个耗时的方法,需要阻塞等待,那么我们有没有办法解决呢?让它异步执行,下面我会详解异步及实现@mikechen 目录 什么是异步? 一.线程异步 二.Future异步 三.Comp ...

  3. Android学习笔记_50_(转 四种加载方式详解(standard singleTop singleTask singleInstance)

    Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...

  4. Android 四种加载方式详解(standard singleTop singleTask singleInstance) .

    Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...

  5. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

  6. 「JavaScript」JS四种跨域方式详解

    原文地址https://segmentfault.com/a/1190000003642057 超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript ...

  7. C++中的四种强制类型转换符详解

    阅读目录 C++即支持C风格的类型转换,又有自己风格的类型转换.C风格的转换格式很简单,但是有不少缺点的: 转换太过随意,可以在任意类型之间转换.你可以把一个指向const对象的指针转换成指向非con ...

  8. SpringDI四种依赖注入方式详解

    文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star!搜索关注微信公众号 [码出Offer] 领取各种学习资料! LOGO SpringDI(依赖注入) 一.DI概述 De ...

  9. VirtualBox的四种网络连接方式详解

    VirtualBox中有4中网络连接方式: 1. NAT 2. Bridged Adapter 3. Internal 4. Host-only Adapter VMWare中有三种,其实他跟VMWa ...

随机推荐

  1. 在Ubuntu下使用nginx-rtmp-module搭建直播系统

    直播系统最简单地包括推流和拉流,在这里先使用nginx-rtmp-module作为流媒体服务器. 流媒体服务器搭建 1. nginx-rtmp-module下载和安装 源码地址:https://git ...

  2. MAC自动化环境搭建

    UI自动化环境搭建 第一阶段:配置appium环境硬件配置mac系统电脑 java环境sunjiedeMacBook-Air:~ vicent$ java -versionjava version & ...

  3. JWT(Json Web Token):一种在Web应用中安全传递信息的规范 转载

    文本将介绍一种在Web应用中安全传递信息的方式,称为JWT. 本文内容是对JWT官网介绍说明的英文翻译而来,由于本文英文水平有限,如有错误,还请指出,谢谢. What is JSON Web Toke ...

  4. thread_asyncio

    thread_asyncio # 使用多线程:在携程中集成阻塞io import asyncio from concurrent.futures import ThreadPoolExecutor i ...

  5. centos7编译安装php 遇到的问题

    centos7 编辑安装php遇到的问题: ./configure 配置遇到的No package 'libxml-2.0' found缺失libxml2.0 库,解决方法: yum -y insta ...

  6. Window包管理工具scoop

    自定义安装路径安装 scoop安装应用路径 目标目录是D:\Program Files\Scoop,在PowerShell命令控制台中运行: [environment]::setEnvironment ...

  7. shell编程(1)

    shell编程(1) 杨乾成 2017301500302 一.尝试ping 题目第一项要求是检验自己主机所在网段有多少主机连通.于是我写的shell程序如下: #!/bin/bash i=; coun ...

  8. machine_math2

    1. 2. 3.拉格朗日对偶??? 弱对偶 强对偶: <1>slater条件(强对偶的充分条件): 1.凸函数. 2.存在一个可行解满足不等式成立. 4.KKT条件

  9. 通过欧拉计划学Rust(第1~6题)

    最近想学习Libra数字货币的MOVE语言,发现它是用Rust编写的,看来想准确理解MOVE的机制,还需要对Rust有深刻的理解,所以开始了Rust的快速入门学习. 看了一下网上有关Rust的介绍,都 ...

  10. long 在不同操作系统下所占用的字节数

    不同平台下C\C++数值数据类型长度如下: 类型 win32 win64 linux32 linux64 其中long类型和指针类型需要特别注意,编写跨平台的软件时尽量不要使用long类型,或者需要对 ...