关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » JAVA »Java Json API:Gson使用简单入门

    Java Json API:Gson使用简单入门

    2015-09-09 00:00:00 出处:itindex
    分享

    GSON是Google开发的Java API,用于转换Java对象和Json对象。ITJS的这篇文章讨论并提供了使用API的简单代码示例。更多关于GSON的API可以访问:http://sites.google.com/site/gson/.

    完全理解Gson(1):简单入门

    ITJS的这篇文章是GSON系列文章的第一篇。ITJS的这篇文章是其他文章的基础,因此不需要任何GSON或JSON经验。第二篇文章提供了关于GSON反序列化(从JSON到Java)的示例,第三篇文章提供了关于GSON序列化(从Java到JSON)的示例。

    下面列出的所有代码都可以在https://java-creed-examples.googlecode.com/svn/gson/Simple%20Gson%20Example. 找到。绝大部分示例都不会包含全部的代码,可能会忽略一些片段,这些片段都与讨论的示例无关。读者可以从上面的链接下载或查阅所有代码。

    读者需要有基础的Java(教程)知识和很基础的Maven(首页)知识。这里展示的代码使用maven来下载GSON库。把项目导入到Springsource Tool Suite(推荐的IDE),无需任何配置。

    下载与安装

    在使用GSON API工作之前,你需要下载库(jar文件),并将其包含到类路径中。库,连同源代码和Java文档,都可以从http://code.google.com/p/google-gson/downloads/list下载。下载完毕后,添加gson-<version>.jar到类路径。对于那些偏好使用Maven管理依赖(JAR文件)的读者,添加如下依赖到pom.xml。

    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.2.4</version>
    </dependency>

    需要修改 <version>2.2.4</version>。ITJS的这篇文章所有代码示例使用上面列出的版本。pom.xml文件拷贝可以在这里找到。

    如果这个库用于web应用,请确保在WEB-INF/lib文件夹中保持一份拷贝。或者,GSON库可以放到应用服务器提供给web应用。

    一个简单示例

    GSON API提供一个类文件,Gson(Java文档),它被用来处理Java和JSON对象的转换。可以调用默认构造器,或如下代码的形式,使用GsonBuilder(Java文档)类创建这个类的实例。GsonBuilder类是可定制化的,并且允许开发者按需实例化Gson。

    package com.javacreed.examples.gson.part1;
    
    import com.google.gson.Gson;
    import com.google.gson.GsonBuilder;
    
    public class SimpleExample1 {
        public static void main(String[] args) {
            Gson gson = new GsonBuilder().create();
            gson.toJson("Hello", System.out);
            gson.toJson(123, System.out);
        }
    }

    在上面的例子中,我们创建了一个Gson实例,并把Java String和int转化为JSON对象。以上代码命令行里的输出结果如下:

    "Hello"123

    这不是火箭科学,但它是一个开始。注意,上述的结果都将输入到命令行。该toJason()方法有两个参数,Java对象转换为JSON和可追加(Java的文档)的一个实例。我们可以很容易地改变了一个文件或网络流。

    package com.javacreed.examples.gson.part1;
    
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Writer;
    import com.google.gson.Gson;
    import com.google.gson.GsonBuilder;
    
    public class SimpleExample2 {
        public static void main(String[] args) throws IOException {
            Writer writer = new FileWriter("Output.json");
    
            Gson gson = new GsonBuilder().create();
            gson.toJson("Hello", writer);
            gson.toJson(123, writer);
    
            writer.close();
        }
    }

    注意

    为什么变量声明为Writer类型,而实际类型是FileWriter

    尽量使用泛型是一个很好的方法。在上例中,我们只使用了Appendable和Writer接口定义的方法。使用泛型使代码更易于移植和维护,下面是个不好的例子。

    注意,上面例子中,我们没有正确处理流(Writer)。理想情况下,资源在finaly块 (教程) 中关闭或者用在try-with-resource(教程)中。我们忽略了这个是为了保持代码简洁。

    public static void main(String[] args) throws IOException {
        try (Writer writer = new FileWriter("Output.json")) {
            Gson gson = new GsonBuilder().create();
            gson.toJson("Hello", writer);
            gson.toJson(123, writer);
        }
    }

    以上代码生成文件:包含JSON对象的Output.json。注意,这里我们使用了字符流而不是字节流。因为toJson()方法需要一个Appendanble实例,而字节流不能实现Appendable接口,所以我们使用了字符流。Appendable接口处理字符而不是字节。Java提供了InputStreanReader(Java文档)和OutputStreamWriter(Java文档)类进行字节流与字符流的转换,如下面的例子。

    注意

    注意,使用InputStreamREader和OutputStreamWriter类时,如果不提供编码或者字符集,转换将使用平台默认字符集。这将降低代码的可移植性,且在其他平台上运行将可能产生错误行为。

    package com.javacreed.examples.gson.part1;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.io.Writer;
    import com.google.gson.Gson;
    import com.google.gson.GsonBuilder;
    
    public class SimpleExample3 {
    
        public static void main(String[] args) throws IOException {
            try(Writer writer = new OutputStreamWriter(new FileOutputStream("Output.json") , "UTF-8")){
                Gson gson = new GsonBuilder().create();
                gson.toJson("Hello", writer);
                gson.toJson(123, writer);
            }
        }
    }

    如你所见,我们只需要改变实例的一部分。代码的剩余部分没有任何变化。这就是使用接口代替类作为变量类型的好处之一。

    使用JSON对象

    比方说,我们需要使用JSON对象并加载他们为Java对象。假设web服务器查询时产生如下JSON对象:

    {
      NAME:"Albert Attard",
      P_LANGUAGE:"Java",
      LOCATION:"Malta"
    }

    此JSON对象包含3个不同值的域。比如我们需要使用JSON对象并创建一个Java对象来展示它。为了使这个例子更有趣,假设我们只关心name和location域。

    首先创建一个Java类来表示name和location。类命名为Person。类的名字无关紧要,但域的名字必须一致。域名必须匹配(大小写敏感)JSON对象中的名字。更进一步,类必须包含一个默认构造函数(即使它被设置为private)。如下所示,name和location域在JSON中是大写的。JSON中域P_LANGUAGE被忽略了,因为Java对象中不包括该名称的域。请理解域名不遵守Java命名规范,暂时只是为了简化。更多内容将在第2部分中讨论。

    package com.javacreed.examples.gson.part2;
    
    public class Person {
        private String NAME;
        private String LOCATION;
    
        // Getters and setters are not required for this example.
        // GSON sets the fields directly using reflection.
    
        @Override
        public String toString() {
            return NAME + " - " + LOCATION;
        }
    }

    准备好Java对象后,我们可以读取JSON对象并加载为Java对象,如下代码所示。为了模拟真实情况,我们使用了字节流作为输入。还要注意,JSON内容保存在resource文件夹的文件里(这不是常规做法)。

    package com.javacreed.examples.gson.part2;
    
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.Reader;
    import com.google.gson.Gson;
    import com.google.gson.GsonBuilder;
    
    public class JsonToJava {
    
        public static void main(String[] args) throws IOException {
            try(Reader reader = new InputStreamReader(JsonToJava.class.getResourceAsStream("/Server1.json"), "UTF-8")){
                Gson gson = new GsonBuilder().create();
                Person p = gson.fromJson(reader, Person.class);
                System.out.println(p);
            }
        }
    }

    输出如下:

    Albert Attard - Malta

    Gson解析JSON对象并创建了一个Person类的实例,并打印到命令行中。

    嵌套JSON对象

    让我们对上面的例子更进一步,以下所示JSON代码段包含了一个嵌套对象。

    {
      NAME:"Albert Attard",
      P_LANGUAGE:"Java",
      LOCATION:"Malta",
      EXAM: {
        SUBJECT:"Programming",
        GRADE:4.5
      }
    }

    EXAM域由两个域组成,分别是SUBJECT和GRADE。我们需要修改Person类的定义来包含EXAM域,并创建一个新的Java类来表示EXAM,该类包含SUBJECT和GRADE域。

    我们首先创建新的类来表示嵌套对象。就像之前讨论那样,类名无关紧要,但是域名必须与JSON中的域名匹配。

    package com.javacreed.examples.gson.part3;
    
    public class Exam {
        private String SUBJECT;
        private double GRADE;
    
        // Getters and setters are not required for this example.
        // GSON sets the fields directly using reflection.
    
        @Override
        public String toString() {
            return SUBJECT + " - " + GRADE;
        }
    }

    现在我们可以修改Person类,引入一个与JSON中EXAM同名的域,类型为Exam。注意,下面的Person类与前一个<span style=”color: #ff0000;”>位于</span>不同的包。

    package com.javacreed.examples.gson.part3;
    
    public class Person {
    
        private String NAME;
        private String LOCATION;
        private Exam EXAM;
    
        @Override
        public String toString() {
            return NAME + " - " + LOCATION + " (" + EXAM + ")";
        }
    }

    注意,所需的变化是最小的,因为Gson动态发现(使用反射)类和它的域。ITJS的这篇文章不包含反射,对于更多关于反射的信息,请参考:Reflection in Action.

    最后,让我们尝试新的变化。

    package com.javacreed.examples.gson.part3;
    
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.Reader;
    import com.google.gson.Gson;
    import com.google.gson.GsonBuilder;
    
    public class JsonToJava {
    
        public static void main(String[] args) throws IOException {
            try(Reader reader = new InputStreamReader(JsonToJava.class.getResourceAsStream("/Server2.json"), "UTF-8")){
                Gson gson = new GsonBuilder().create();
                Person p = gson.fromJson(reader, Person.class);
                System.out.println(p);
            }
        }
    }

    JsonToJava类没有做任何改变,因为Gson使用了模型(Person和Exam类)将Json映射成Java。

    结论

    即使JSON可能是一个新概念,但它十分简单与直接。此外,相比于需要增加标签进行消息/数据转换而不断膨胀的笨重的XML,它因为简单更加流行。需要指出JSON是JavaScript的一个子集,JavaScript将它作为一个完美的方案来进行数据交换,例如网页。GSON API使它更便于使用,即使在这里没有讨论的部分,它也提供了强大的灵活性。

    欲了解更多GSON的例子,请移步第2部分,我们会探索更复杂的例子,并讨论如何使用GSON解串器来完全控制反序列化过程。

    相关文章

    GSON Annotations Example Gson TypeAdapter Example Serialise Large Objects GSON Serialiser Example Gson TypeAdapter Example GSON Deserialiser Example
    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    帝国CMS7.5编辑器上传图片取消宽高的三种方法

    帝国cms如何自动生成缩略图的实现方法

    Windows 12即将到来,将彻底改变人机交互

    帝国CMS 7.5忘记登陆账号密码怎么办?可以phpmyadmin中重置管理员密码

    帝国CMS 7.5 后台编辑器换行,修改回车键br换行为p标签

    Windows 11 版本与 Windows 10比较,新功能一览

    Windows 11激活产品密钥收集及专业版激活方法

    如何从 Windows 11 中完全删除/卸载 OneNote?无解!

    抖音安全与信任开放日:揭秘推荐算法,告别单一标签依赖

    ultraedit编辑器打开文件时,总是提示是否转换为DOS格式,如何关闭?

    IT头条

    华为Pura80系列新机预热,余承东力赞其复杂光线下的视频拍摄实力

    01:28

    阿里千问3开源首战告捷:全球下载破千万,国产AI模型崛起新高度!

    01:22

    DeepSeek R1小版本试升级:网友实测编程能力已达到国际一线水平

    23:15

    NVIDIA 与 Dell 合作,大规模交付 Blackwell AI 系统

    20:52

    Cerebras 以最快的 Llama 4 Maverick 性能引领 LLM 推理竞赛

    20:51

    技术热点

    PHP中的随机性——你觉得自己幸运吗?

    搞定Ubuntu Linux下WPA无线上网

    Java使用内存映射实现大文件的上传

    MySQL安全性指南

    MySQL两项性能的基本测试浅谈

    教您使用UniqueIdentifier选取SQL Server主键

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。