GSON的用法(处理对象和JSON的相互转化)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: GSON的用法(处理对象和JSON的相互转化)

GSON的用法(处理对象和JSON的相互转化):

Gson是Google自己写的一个Java对象与JSON相互转化的工具包,首先我们需要下载jar包,这里可用idea直接下载,下载步骤如下;点击项目结构

点击+号:

点击maven:

然后搜索jar包关键字gson:

下载到项目的指定位置

编写一个JSON文件

[
  {
    "id": 9223232323,
    "text": "How do I read a JSON stream in Java",
    "geo": null,
    "user": {
      "name": "json_new",
      "followers_count": 41
    }
  },
  {
    "id": 8787879686,
    "text": "@Json just use JsonReader",
    "geo": [
      56.23212323,
      -1034.343
    ],
    "user": {
      "name": "java nb",
      "followers_count": 2
    }
  }
]

所对应的实体类:

package com.lili.json;
import java.util.Arrays;
import java.util.List;
/**
 * @author: QiJingJing
 * @create: 2021/7/18
 */
public class Message {
    private long id;
    private String text;
    private List<Double> geo;
    private User user;
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getText() {
        return text;
    }
    public void setText(String text) {
        this.text = text;
    }
    public List<Double> getGeo() {
        return geo;
    }
    public void setGeo(List<Double> geo) {
        this.geo = geo;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    @Override
    public String toString() {
        return "Message{" +
                "id=" + id +
                ", text='" + text + '\'' +
                ", geo=" + geo +
                ", user=" + user +
                '}';
    }
}
package com.lili.json;
/**
 * @author: QiJingJing
 * @create: 2021/7/18
 */
public class User {
    private String name;
    private int followers_count;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getFollowers_count() {
        return followers_count;
    }
    public void setFollowers_count(int followers_count) {
        this.followers_count = followers_count;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", followers_count=" + followers_count +
                '}';
    }
}

编写代码解析复杂JSON:

public class JsonTest {
    /**
     * 使用JsonReader解析一个复杂的json
     */
    @Test
    public void parseJsonMessages() throws IOException {
        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/lili/json/message.json");
        InputStreamReader reader = new InputStreamReader(is);
        JsonReader jsonReader = new JsonReader(reader);
        List<Message> list = new ArrayList<>();
        jsonReader.beginArray();
        while (jsonReader.hasNext()){
            list.add(parseJsonMessage(jsonReader));
        }
        jsonReader.endArray();
        System.out.println(Arrays.toString(list.toArray()));
    }
    /**
     * 解析message类的方法
     */
    private Message parseJsonMessage(JsonReader reader) throws IOException {
        Message message = null;
        reader.beginObject();
        message = new Message();
        while (reader.hasNext()) {
            String name = reader.nextName();
            if("id".equals(name)){
                message.setId(reader.nextLong());
            }else if("text".equals(name)){
                message.setText(reader.nextString());
            }else if("geo".equals(name) && reader.peek() != JsonToken.NULL){
              message.setGeo(readGeo(reader));
            }else if("user".equals(name)){
                message.setUser(parseJsonUser(reader));
            }else {
                // 最好加上
                reader.skipValue();
            }
        }
        reader.endObject();
        return message;
    }
    /**
     * 解析geo
     */
    private List<Double> readGeo(JsonReader reader) throws IOException {
        List<Double> list = new ArrayList<>();
        reader.beginArray();
        while (reader.hasNext()){
            list.add(reader.nextDouble());
        }
        reader.endArray();
        return list;
    }
    /**
     * 解析user类的方法
     */
    public User parseJsonUser(JsonReader reader) throws IOException {
        User user = null;
        reader.beginObject();
        user = new User();
        while (reader.hasNext()) {
            String name = reader.nextName();
            if("name".equals(name)){
                user.setName(reader.nextString());
            }else if("followers_count".equals(name)){
                user.setFollowers_count(reader.nextInt());
            }else{
                // 最好加上
                reader.skipValue();
            }
        }
        reader.endObject();
        return user;
    }
}

运行结果:

[Message{id=9223232323, text='How do I read a JSON stream in Java', geo=null, user=User{name='json_new', followers_count=41}}, Message{id=8787879686, text='@Json just use JsonReader', geo=[56.23212323, -1034.343], user=User{name='java nb', followers_count=2}}]

利用Gson工具类将一组JSON对象转换成对象集合,或把对象集合转化为JSON数组:

写一个新的JSON文件:

[
  {
    "firstName": "qi",
    "lastName": "jing",
    "email": "2811157481@qq.com"
  },
  {
    "firstName": "yang",
    "lastName": "li",
    "email": "2811157481@qq.com"
  }
]

对应实体类:

package com.lili.json;
/**
 * @author: QiJingJing
 * @create: 2021/7/18
 */
public class Name {
    private String firstName;
    private String lastName;
    private String email;
    public Name() {
    }
    public Name(String firstName, String lastName, String email) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    @Override
    public String toString() {
        return "Name{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

编写测试代码:

/**
 * 把一组JSON对象转换成对象集合,或把对象集合转化为JSON数组
 */
@Test
public void gson2(){
    Gson gson = new Gson();
    InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/lili/json/name.json");
    assert resourceAsStream != null;
    InputStreamReader reader = new InputStreamReader(resourceAsStream);
    TypeToken<List<Name>> typeToken = new TypeToken<List<Name>>(){};
    List<Name> list = gson.fromJson(reader, typeToken.getType());
    System.out.println(list);
    // 再转回去
    String json = gson.toJson(list, typeToken.getType());
    System.out.println(json);
}

对象集合和json数据如下:

[Name{firstName='qi', lastName='jing', email='2811157481@qq.com'}, Name{firstName='yang', lastName='li', email='2811157481@qq.com'}]
[{"firstName":"qi","lastName":"jing","email":"2811157481@qq.com"},{"firstName":"yang","lastName":"li","email":"2811157481@qq.com"}]


目录
相关文章
|
1月前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
在Java中处理JSON数据:Jackson与Gson库比较
|
1月前
|
JSON JavaScript 前端开发
JSON.parse()和JSON.stringify()用法
JSON.parse()和JSON.stringify()用法
45 1
|
1月前
|
JSON 前端开发 JavaScript
json字符串如何转为list对象?
json字符串如何转为list对象?
218 7
|
1月前
|
JSON JavaScript 前端开发
js如何格式化一个JSON对象?
js如何格式化一个JSON对象?
65 3
|
2月前
|
JSON JavaScript 数据格式
vue写入json数据到文本中+vue引入cdn的用法
vue写入json数据到文本中+vue引入cdn的用法
56 10
|
2月前
|
XML JSON JavaScript
JSON对象的stringify()和parse()方法使用
本文阐述了JSON对象的`stringify()`和`parse()`方法的用法,包括如何将JavaScript对象转换为JSON字符串,以及如何将JSON字符串解析回JavaScript对象,并讨论了转换过程中需要注意的事项。
JSON对象的stringify()和parse()方法使用
|
2月前
|
JSON 前端开发 中间件
React读取properties配置文件转化为json对象并使用在url地址中
本文介绍了如何在React项目中读取properties配置文件,将其内容转化为JSON对象,并在请求URL地址时使用这些配置。文章详细说明了异步读取文件、处理字符串转换为JSON对象的过程,并提供了一个封装函数,用于在发起请求前动态生成配置化的URL地址。
77 1
|
2月前
|
JSON 前端开发 JavaScript
JSON用法
JSON用法
33 4
|
JSON Java 数据格式