当前位置: 首页 > 科技观察

JavaJsonAPI:Gson简单介绍

时间:2023-03-20 00:25:27 科技观察

GSON是Google开发的JavaAPI,用于Java对象和Json对象的转换。本文讨论并提供使用API的简单代码示例。更多关于GSON的API可以访问:http://sites.google.com/site/gson/。本文是GSON系列的第一篇文章。本文是其他文章的基础,因此不需要GSON或JSON经验。第二篇文章提供了一个GSON反序列化(JSON转Java)的例子,第三篇文章提供了一个GSON序列化(Java转JSON)的例子。下面列出的所有代码都可以在https://java-creed-examples.googlecode.com/svn/gson/Simple%20Gson%20Example中找到。大多数示例不会包含所有代码,并且可能会省略与正在讨论的示例无关的片段。读者可以从上面的链接下载或查看所有代码。读者需要具备基本的Java(教程)知识和非常基本的Maven(主页)知识。此处显示的代码使用maven下载GSON库。将项目导入SpringsourceToolSuite(推荐IDE),无需任何配置。下载和安装在使用GSONAPI之前,您需要下载库(jar文件)并将其包含在您的类路径中。该库连同源代码和Java文档可以从http://code.google.com/p/google-gson/downloads/list下载。下载后,将gson-.jar添加到类路径中。对于那些喜欢使用Maven来管理依赖项(JAR文件)的读者,请将以下依赖项添加到pom.xml中。com.google.code.gsongson2.2.4需要修改2.2.4。本文中的所有代码示例均使用上面列出的版本。可以在此处找到pom.xml文件的副本。如果此库用于Web应用程序,请确保在WEB-INF/lib文件夹中保留一份副本。或者,GSON库可以放在应用程序服务器中并提供给Web应用程序。一个简单的例子GSONAPI提供了一个类文件Gson(JavaDocumentation),用于处理Java和JSON对象的转换。您可以调用默认构造函数,或使用GsonBuilder(Java文档)类以以下代码的形式创建此类的实例。GsonBuilder类是可定制的,允许开发人员按需实例化Gson。packagecom.javacreed.examples.gson.part1;importcom.google.gson.Gson;importcom.google.gson.GsonBuilder;publicclassSimpleExample1{publicstaticvoidmain(String[]args){Gsongson=newGsonBuilder().create();gson.toJson("Hello",System.out);gson.toJson(123,System.out);}}在上面的例子中,我们创建了一个Gson实例,并将JavaString和int转换为JSON对象。上述代码的命令行输出如下所示:“Hello”123这不是火箭科学,但它是一个开始。注意,上面的结果都会被输入到命令行中。toJason()方法有两个参数,一个要转换为JSON的Java对象和一个Appendable实例(Java文档)。我们可以轻松更改文件或网络流。packagecom.javacreed.examples.gson.part1;importjava.io.FileWriter;importjava.io.IOException;importjava.io.Writer;importcom.google.gson.Gson;importcom.google.gson.GsonBuilder;publicclassSimpleExample2{publicstaticvoidmain(字符串[]args)throwsIOException{Writerwriter=newFileWriter("Output.json");Gsongson=newGsonBuilder().create();gson.toJson("Hello",writer);gson.toJson(123,writer);writer.close();}}注意为什么变量声明为Writer类型,但实际类型是FileWriter?尽可能多地使用泛型是个好主意。在上面的例子中,我们只使用了Appendable和Writer接口定义的方法。使用泛型使代码更具可移植性和可维护性,下面是一个不好的例子。请注意,在上面的示例中,我们没有正确处理流(Writer)。理想情况下,资源在finally块中关闭(教程)或在try-with-resource中使用(教程)。我们省略它以保持代码简洁。\publicstaticvoidmain(String[]args)throwsIOException{try(Writerwriter=newFileWriter("Output.json")){Gsongson=newGsonBuilder().create();gson.toJson("Hello",writer);gson.toJson(123,writer);}}上面的代码生成一个文件:包含JSON对象的Output.json。请注意,这里我们使用字符流而不是字节流。因为toJson()方法需要一个Appendable实例,而字节流无法实现Appendable接口,所以我们使用字符流。Appendable接口处理字符而不是字节。Java提供了InputStreanReader(Java文档)和OutputStreamWriter(Java文档)类来转换字节流和字符流,如下例所示。请注意,在使用InputStreamREader和OutputStreamWriter类时,如果未提供编码或字符集,转换将使用平台默认字符集。这将降低代码的可移植性,并可能在其他平台上运行时产生不正确的行为。packagecom.javacreed.examples.gson.part1;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.OutputStreamWriter;importjava.io.Writer;importcom.google.gson.Gson;importcom.google.gson.GsonBuilder;publicclassSimpleExample3{publicstaticvoidmain(String[]args)throwsIOException{try(Writerwriter=newOutputStreamWriter(newFileOutputStream("Output.json"),"UTF-8")){Gsongson=newGsonBuilder().create();gson.toJson("你好",writer);gson.toJson(123,writer);}}}如您所见,我们只需要更改部分实例。其余代码没有任何改变。这是使用接口而不是类作为变量类型的好处之一。使用JSON对象假设我们需要获取JSON对象并将它们作为Java对象加载。假设在查询Web服务器时生成以下JSON对象:{NAME:"AlbertAttard",P_LANGUAGE:"Java",LOCATION:"Malta"}这个JSON对象包含3个不同值的字段。假设我们需要获取一个JSON对象并创建一个Java对象来显示它。为了让这个例子更有趣,假设我们只关心名称和位置字段。首先创建一个Java类来表示名称和位置。该类名为Person。类名无所谓,但字段名一定要一致。域名必须与JSON对象中的名称匹配(区分大小写)。此外,该类必须包含一个默认构造函数(即使它被设置为私有)。如下所示,name和location字段在JSON中是大写的。JSON中的P_LANGUAGE字段被忽略,因为Java对象不包含该名称的字段。请理解域名不遵循Java命名约定,目前只是为了简化。更多内容将在第2部分中讨论。publicclassPerson{privateStringNAME;privateStringLOCATION;//Gettersandsettersarenotrequiredforthisexample.//GSONsetsthefieldsdirectlyusingreflection.@OverridepublicStringtoString(){returnNAME+"-"+LOCATION;}}一旦Java对象准备好了,我们就可以读取JSON对象并加载为Java对象,如图在下面的代码中。为了模拟真实情况,我们使用字节流作为输入。另请注意,JSON内容保存在资源文件夹中的文件中(这不是规范)。packagecom.javacreed.examples.gson.part2;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.Reader;importcom.google.gson.Gson;importcom.google.gson.GsonBuilder;publicclassJsonToJava{publicstaticvoidmain(String[]args)throwsIOException{try(Readerreader=newInputStreamReader(JsonToJava.class.getResourceAsStream("/Server1.json"),"UTF-8")){Gsongson=newGsonBuilder().create();Personp=gson.fromJson(阅读器,人.类);System.out.println(p);}}}输出如下:AlbertAttard-MaltaGson解析JSON对象并创建Person类的实例,该实例将打印到命令行。嵌套的JSON对象将上面的示例更进一步,以下JSON片段包含一个嵌套对象。{NAME:"AlbertAttard",P_LANGUAGE:"Java",LOCATION:"Malta",EXAM:{SUBJECT:"Programming",GRADE:4.5}}EXAM域由两个域组成,SUBJECT和GRADE。我们需要修改Person类的定义以包含EXAM字段,并创建一个新的Java类来表示包含SUBJECT和GRADE字段的EXAM。我们首先创建新类来表示嵌套对象。如前所述,类名无关紧要,但域名必须与JSON中的域名相匹配。packagecom.javacreed.examples.gson.part3;publicclassExam{privateStringSUBJECT;privatedoubleGRADE;//Gettersandsettersarenotrequiredforthisexample.//GSONsetsthefieldsdirectlyusingreflection.@OverridepublicStringtoString(){returnSUBJECT+"-"+GRADE;}}现在我们可以引入一个修改过的JSONPerson类,一个与EXAM同名的字段,类型为Exam.请注意,以下Person类位于与前一个不同的包中。packagecom.javacreed.examples.gson.part3;publicclassPerson{privateStringNAME;privateStringLOCATION;privateExamEXAM;@OverridepublicStringtoString(){returnNAME+"-"+LOCATION+"("+EXAM+")";}}请注意,所需的更改很小,因为Gson动态发现(使用反射)类及其领域。本文不涉及反射,更多关于反射的内容请参考:ReflectioninAction.***,让我们尝试新的变化。packagecom.javacreed.examples.gson.part3;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.Reader;importcom.google.gson.Gson;importcom.google.gson.GsonBuilder;publicclassJsonToJava{publicstaticvoidmain(String[]args)throwsIOException{try(Readerreader=newInputStreamReader(JsonToJava.class.getResourceAsStream("/Server2.json"),"UTF-8")){Gsongson=newGsonBuilder().create();Personp=gson.fromJson(阅读器,人.类);System.out.println(p);}}}JsonToJava类没有做任何改变,因为Gson使用模型(Person和Exam类)将Json映射到Java。结论尽管JSON可能是一个新概念,但它非常简单明了。此外,它比笨拙的XML更受欢迎,因为它随着添加消息/数据转换的标签的需要而不断增长。需要指出的是,JSON是JavaScript的一个子集,JavaScript将其作为数据交换的完美解决方案,例如网页。GSONAPI使其更易于使用,即使在此处未讨论的部分,它也提供了极大的灵活性。有关更多GSON示例,请转到第2部分,我们将在其中探索更复杂的示例并讨论如何使用GSON反序列化器来完全控制反序列化过程。相关文章GSONAnnotationsExampleGsonTypeAdapterExampleSerialiseLargeObjectsGSONSerialiserExampleGsonTypeAdapterExampleGSONDeserialiserExample