Java 与 JSON

JSON 是不同程序之间传递信息的一种格式。本文描述了 JSON 在 Java 中的应用。

目前 Java 中比较主流的相关解析工具有谷歌提供的 Gson 和阿里提供的 FastJSON 。

一、JSON 格式

JSON: JavaScript Object Notation(JS对象简谱),是一种轻量级的数据交换格式。

例如一本书,有 id 属性值为 "1001",有 name 属性值为 "book",有 info 属性值为 "简介",用 JSON 表示如下:

{
"id":"1001",
"name":"book",
"info":"简介"
}

另外,JSON 格式中还可以包含数组(用中括号包含[,,,]),对象之间还可以互相嵌套。

例如一个柜子,名字是 "书柜",有一个 "books" 属性包含了三本书,还有一个 belong 属性表示属于某个人,可以表示为:

{
"name":"书柜",
"books":["book1","book2",{
"id":"1001",
"name":"book",
"info":"简介"
}],
"belong":{
"name":"张三",
"age":18,
}
}

二、Java 与 JSON

1. Gson

使用 Gson 类的一个实例可以将一串包含 JSON 的字符串中的数据解析为一个 Java 对象的实例,也可以将一个类的信息保存到一串 JSON 字符串中。

后文中的代码使用的 Book 类和 Cabinet 类如下

class Book {

    private int id;
private String name;
private String info; public String toString() {
return "name:" + name + ", info:" + info;
} } class Cabinet { private String name;
private Book[] books;
private String belong; public String toString() {
return "Cabinet{" +
"name='" + name + '\'' +
", books=" + Arrays.toString(books) +
", belong='" + belong + '\'' +
'}';
} public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Cabinet cabinet = (Cabinet) o;
return Objects.equals(name, cabinet.name) && Arrays.equals(books, cabinet.books) && Objects.equals(belong, cabinet.belong);
} public int hashCode() {
int result = Objects.hash(name, belong);
result = 31 * result + Arrays.hashCode(books);
return result;
} public Cabinet() {} public Cabinet(String name, Book[] books, String belong) {
this.name = name;
this.books = books;
this.belong = belong;
} }
  • 保存信息: toJson(Object src)方法

    • 将一个类保存为 json 格式
    import com.google.gson.Gson;
    
    public class Demo1 {
    public static void main(String[] args) {
    // 创建 Gson 对象
    Gson gson = new Gson();
    Book b = new Book(1001, "book", "info"); // 将一个对象 b 转换为 json 字符串
    String s = gson.toJson(b);
    System.out.println(s);
    }
    }
    • 将一个集合保存为 json 格式
    import com.google.gson.Gson;
    import java.util.ArrayList;
    public class Demo2 {
    public static void main(String[] args) {
    // 创建 Gson 对象
    Gson gson = new Gson();
    ArrayList<Object> list = new ArrayList<>();
    list.add("abc");
    list.add(new Book(1001, "book", "info"));
    // 将一个集合 list 转换为 json 字符串
    String s = gson.toJson(list);
    System.out.println(s);
    }
    }
    • 将一个复杂的对象用 json 格式保存到文件中
    import com.google.gson.Gson;
    import java.io.*;
    public class Demo3 {
    public static void main(String[] args) throws IOException {
    // 创建 Gson 对象
    Gson gson = new Gson();
    // 将一个复杂的对象转换为字符串
    String s = gson.toJson(new Cabinet("Cabinet",
    new Book[]{new Book(1001, "book1", "info1"),
    new Book(1002, "book2", "info2"),
    new Book(1003, "book3", "info3")}, "张三"));
    // 将获得的字符串写入文件中
    FileWriter fw = new FileWriter("cabinet.json");
    fw.write(s);
    fw.close(); // 记得关闭流!
    }
    }
  • 解析 JSON 字符串: fromJson(String json, Class classOfT) 方法
    • 解析一个类
    import com.google.gson.Gson;
    public class Demo4 {
    public static void main(String[] args) {
    Gson gson = new Gson();
    // {"name":"book","info":"abc"}
    Book book = gson.fromJson("{\"name\":\"book\",\"info\":\"abc\"}", Book.class);
    System.out.println(book);
    }
    }
    • 解析一个数组
    import com.google.gson.Gson;
    import java.util.List;
    public class Demo5 {
    public static void main(String[] args) {
    // ["abc","bcd","cde"]
    List list = new Gson().fromJson("[\"abc\",\"bcd\",\"cde\"]",List.class);
    for (Object s : list) {
    System.out.println(s);
    }
    }
    }
    • 从文件中解析一个较为复杂的类
    import com.google.gson.Gson;
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    public class Demo6 {
    public static void main(String[] args) throws IOException {
    // 此处使用的文件为上面代码中保存的 cabinet.json 文件
    // 读取文件中的数据
    BufferedReader br = new BufferedReader(new FileReader("cabinet.json"));
    String s = br.readLine();
    br.close(); // 别忘记关闭!
    // 创建 Gson 对象
    Gson gson = new Gson();
    // 如果我们没有 Cabinet 这个类,则可以转化为 HashMap 对象
    HashMap hashMap = gson.fromJson(s, HashMap.class);
    // 打印全部
    System.out.println(hashMap);
    List<Book> list = (List<Book>) hashMap.get("books");
    // 打印 books
    System.out.println(list.get(1));
    }
    }

注意:JSON 字符串应该对应好对应类的各个属性名,如果 JSON 字符串中出现了对应类中没有的属性名,那么这个属性将被忽略。同理,如果 JSON 字符串中没有对应类中的属性,那么对应的类的这个属性设置为默认值。

2.FastJSON

使用 FastJSON 解析或保存 JSON 字符串方法:

  • 保存信息: toJSONString(Object object)方法

    注意:使用 FastJSON 保存的类每个属性必须有 get 方法,否则无法保存。上面的 Book 类没有提供 get 方法,则无法保存。

    • 保存一个类的信息
    import com.alibaba.fastjson.JSON;
    public class Demo {
    public static void main(String[] args) {
    // 假设这个类有提供 get 方法
    Book b = new Book(1001, "book", "info");
    // 转化为 JSON 字符串
    String s = JSON.toJSONString(b);
    // 打印出来检查是否正确
    System.out.println(s);
    }
    }
    • 保存一个集合(数组)的信息
    import com.alibaba.fastjson.JSON;
    public class Demo {
    public static void main(String[] args) {
    // 这里假设 Book 类有提供 get 方法
    Book[] b = new Book[]{new Book(1001, "book", "info"), new Book(1002, "abc", "ofni")};
    String s = JSON.toJSONString(b);
    System.out.println(s);
    }
    }
    • 保存一个较为复杂的类到文件中
    import com.alibaba.fastjson.JSON;
    import java.io.FileWriter;
    import java.io.IOException; public class Demo {
    public static void main(String[] args) throws IOException {
    Book b1 = new Book(1001, "1", "a");
    Book b2 = new Book(1002, "2", "b");
    Book b3 = new Book(1003, "3", "c");
    Book[] bs = {b1, b2, b3};
    Cabinet c = new Cabinet("cabinet", bs, "abc");
    String json = JSON.toJSONString(c);
    FileWriter fw = new FileWriter("cabinet2.json");
    fw.write(json);
    fw.close();
    }
    }
  • 解析 JSON 字符串: parseObject(String text, Class clazz) 方法

    注意:获取信息的类必须提供 无参构造方法和各个 set 方法,否则会出现 JSONException 异常

    • 解析得到一个类的信息
    import com.alibaba.fastjson.JSON;
    public class Demo {
    public static void main(String[] args){
    // {"id":1001,"name":"b","info":"1"}
    Book b = JSON.parseObject("{\"id\":1001,\"name\":\"b\",\"info\":\"1\"}", Book.class);
    System.out.println(b);
    }
    }
    • 解析得到一个数组信息
    import com.alibaba.fastjson.JSON
    import java.io.IOException;
    import java.util.List;
    public class Demo {
    public static void main(String[] args) {
    // ["",{"id":123,"name":"abc"},null]
    List list = (List) JSON.parse("[\"\",{\"id\":123,\"name\":\"abc\"},null]");
    System.out.println(list.get(1));
    }
    }
    • 从文件中解析得到一个较为复杂的对象
    import com.alibaba.fastjson.JSON;
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.List;
    public class Demo {
    public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new FileReader("cabinet2.json"));
    String s = br.readLine();
    HashMap hashMap = JSON.parseObject(s, HashMap.class);
    System.out.println(hashMap);
    List list = (List) hashMap.get("books");
    System.out.println(list.get(1));
    HashMap book2 = JSON.parseObject(list.get(1).toString(), HashMap.class);
    System.out.println(book2.get("name"));
    }
    }

java 与 JSON的更多相关文章

  1. Java集合 Json集合之间的转换

    1. Java集合转换成Json集合 关键类:JSONArray jsonArray = JSONArray.fromObject(Object obj); 使用说明:将Java集合对象直接传进JSO ...

  2. Java对象 json之间的转换(json-lib)

    在这里主要简单的介绍一下,如何使用json-lib这个工具包来完成Java对象(或集合)与json对象(或集合)之间的转换~ 1. Java对象转换成json(既创建json) 关键类:JSONObj ...

  3. Java 的 JSON 开源类库选择比较(zz)

    在看了作者的介绍,然后我又到mvnrepository上去看了各个库的的使用数之后,发现只能在jackson和gson之间做选择. 以下是原文 有效选择七个关于Java的JSON开源类库 April  ...

  4. java中json包的使用以及字符串,map,list,自定义对象之间的相互转换

    做一个map和字符串的转换,需要导入这些jar包,这是最基本的一些jar包. 经过多方尝试得出结论入下: 首先导入基本包:json-lib-2.2.3-jdk15.jar 如果没有这个jar包,程序是 ...

  5. java系列--JSON数据的处理

    http://blog.csdn.net/qh_java/article/details/38610599 http://www.cnblogs.com/lanxuezaipiao/archive/2 ...

  6. Java之JSON数据

    特别注意:使用JSON前需要导包 操作步骤地址:http://blog.csdn.net/baidu_37107022/article/details/70876993 1.定义 JSON(JavaS ...

  7. JSON以及Java转换JSON的方法(前后端常用处理方法)

    )); map.put("arr", new String[] { "a", "b" }); map.put("func" ...

  8. java处理json与对象的转化 递归

    整个类是一个case,总结了我在使用java处理json的时候遇到的问题,还有级联关系的对象如何遍历,json和对象之间的转换! 对于对象json转换中遇到的问题我参考了一篇博客,http://blo ...

  9. Java JWT: JSON Web Token

    Java JWT: JSON Web Token for Java and Android JJWT aims to be the easiest to use and understand libr ...

  10. Java解析json字符串和json数组

    Java解析json字符串和json数组 public static Map<String, String> getUploadTransactions(String json){ Map ...

随机推荐

  1. uniapp与原生交互

    1.项目中引入 DSBridge.js 文件 var bridge = { default: this, call: function(b, a, c) { var e = ""; ...

  2. (Fiddler)Fiddler 的相关操作

    Fiddler 的几个常用操作: 1. Statistics:会话信息统计 1)选择当前页面的第一个请求和最后一个请求,通过计算 statistics,就知道该页面总共的耗时时间. 2)查出当前页面耗 ...

  3. MySQL中的sql优化

    目标: 掌握SQL调优的原则 掌握SQL调优的基本逻辑 掌握优秀SQL的编写方案 掌握何为慢SQL以及检测方案 SQL优化原则 1.减少数据量(表中数据太多可以分表,例如超过500万数据  双11一个 ...

  4. CSS渐变样色的字

    width: 118px; height: 17px; font-size: 13px; font-family: MicrosoftYaHei-Bold, MicrosoftYaHei; font- ...

  5. fillder弱网测试

    打开Fiddler,Rules->Performance->勾选 Simulate Modem Speeds,勾选之后访问网站会发现网络慢了很多. 二.设置弱网参数:菜单Rules-> ...

  6. unity ScriptObject使用

    转自 https://www.jianshu.com/p/77fabc83555b using UnityEngine; [CreateAssetMenu(fileName = "Untit ...

  7. jQuary学习(一)

    一.jQuary简介 jQuery是继prototype之后又一个优秀的Javascript框架.其宗旨是--WRITE LESS,DO MORE,写更少的代码,做更多的事情. jQuery能够使用户 ...

  8. 配置中包含maven属性,在idea中本地启动无法正常获取配置

    1. 本地启动一个spring cloud 项目,无法启动 (注:测试环境正常),且控台无错误日志. 分析:debug 代码发现是配置无法获取. 查看配置获取方式 是 spring config 通过 ...

  9. C语言经典100例【1、2】

    [1]三位数字重组问题 题目:有 1.2.3.4 四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 分析:分别把1,2,3,4放在个位.十位和百位,用嵌套循环即可解决.注意要求无重复数字 ...

  10. Day 22 22.1:增量式爬虫

    Day 22 22.1:增量式爬虫 爬虫应用场景分类 通用爬虫 聚焦爬虫 功能爬虫 分布式爬虫 增量式爬虫: 用来监测网站数据更新的情况(爬取网站最新更新出来的数据). 只是一种程序设计的思路,使用什 ...