Java类和JSON

Speaker类:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class Speaker {private int id;private int age;private String fullName;private List<String> tags = new ArrayList<>(); private boolean registered;public Speaker() {super();}public Speaker(int id, int age, String fullName, List<String> tags, boolean registered) {super();this.id = id;this.age = age;this.fullName = fullName;this.tags = tags;this.registered = registered;}public Speaker(int id, int age, String fullName, String[] tags, boolean registered) {this(id, age, fullName, Arrays.asList(tags), registered);}public int getId() {return id;}public void setId(int id) {this.id = id;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getFullName() {return fullName;}public void setFullName(String fullName) {this.fullName = fullName;}public List<String> getTags() {return tags;}public void setTags(List<String> tags) {this.tags = tags;}public boolean isRegistered() {return registered;}public void setRegistered(boolean registered) {this.registered = registered;}@Overridepublic String toString() {return String.format("Speaker [id=%s, age=%s, fullName=%s, tags=%s, registered=%s]", id, age, fullName, tags,registered);}}

JSON文件

speaker.json

{"id": 1,"fullName": "Larson Richard","tags": ["JavaScript", "AngularJS", "Yeoman"],"age": 39,"registered": true
}

speakers.json

{"speakers": [{"id": 1,"fullName": "Larson Richard","tags": ["JavaScript","AngularJS","Yeoman"],"age": 39,"registered": true},{"id": 2,"fullName": "Ester Clements","tags": ["REST","Ruby on Rails","APIs"],"age": 29,"registered": true},{"id": 3,"fullName": "Christensen Fisher","tags": ["Java","Spring","Maven","REST"],"age": 45,"registered": false}]
}

对Java简单数据类型进行序列化/反序列化操作

这里的简单数据类型是指:

  • 整数型
  • 字符串
  • 数组
  • 布尔值

下面的单元测试程序应用了Jackson和JUnit4对Java中的简单数据类型进行序列化/反序列化操作:

import static org.junit.Assert.*;import java.io.*;
import java.util.*;import org.junit.Test;import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.type.*;
import com.fasterxml.jackson.databind.*;public class BasicJsonTypesTest {private static final String TEST_SPEAKER = "age = 39\n" + "fullName = \"Larson Richard\"\n" +"tags = [\"JavaScript\",\"AngularJS\",\"Yeoman\"]\n" + "registered = true";@Testpublic void serializeBasicTypes() {try {ObjectMapper mapper = new ObjectMapper();Writer writer = new StringWriter();int age = 39;String fullName = new String("Larson Richard");List<String> tags = new ArrayList<String>(Arrays.asList("JavaScript", "AngularJS", "Yeoman"));boolean registered = true;String speaker = null;writer.write("age = ");mapper.writeValue(writer, age);writer.write("\nfullName = ");mapper.writeValue(writer, fullName);writer.write("\ntags = ");mapper.writeValue(writer, tags);writer.write("\nregistered = ");mapper.configure(SerializationFeature.INDENT_OUTPUT, true);mapper.writeValue(writer, registered);speaker = writer.toString();System.out.println(speaker);assertTrue(TEST_SPEAKER.equals(speaker));assertTrue(true);} catch (JsonGenerationException jge) {jge.printStackTrace();fail(jge.getMessage());} catch (JsonMappingException jme) {jme.printStackTrace();fail(jme.getMessage());} catch (IOException ioe) {ioe.printStackTrace();fail(ioe.getMessage());}}@Testpublic void deSerializeBasicTypes() {try {String ageJson = "{ \"age\": 39 }";ObjectMapper mapper = new ObjectMapper();Map<String, Integer> ageMap = mapper.readValue(ageJson,new TypeReference<HashMap<String,Integer>>() {});Integer age = ageMap.get("age");System.out.println("age = " + age + "\n\n\n");assertEquals(39, age.intValue());assertTrue(true);} catch (JsonMappingException jme) {jme.printStackTrace();fail(jme.getMessage());} catch (IOException ioe) {ioe.printStackTrace();fail(ioe.getMessage());}}}

在上面的实例中,由于@Test注解的声明,JUnit会将serializeBasicTypes()和deSerializeBasicTypes()方法作为测试的一部分来运行。对于JSON数据自身来说,这些单元测试用例并未执行太多断言操作。

归纳一下,以下是Jackson中用于JSON序列化/反序列化的一些重要的类和方法:

  • ObjectMapper 类负责在Java和JSON之间进行相互转换。
  • ObjectMapper.writeValue() 方法负责将Java数据类型转换为JSON(本例中转换结果被输出到Writer对象中)。
  • ObjectMapper.readValue() 方法负责阿静JSON转换为Java数据结构。

对Java对象进行序列化/反序列化操作

如果只是对简单数据类型进行序列化/反序列化,并没有什么有趣的功能。下面是对Java对象进行的操作,这时序列化/反序列化显得比较有用。

下面的程序展示了如何用Jackson来序列化/反序列化speaker对象,同时也展示了如何将JSON文件反序列化为多个speaker对象:

import static org.junit.Assert.*;import java.io.*;
import java.net.*;
import java.util.*;import org.junit.Test;import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.type.*;public class SpeakerJsonFlatFileTest {private static final String SPEAKER_JSON_FILE_NAME = "speaker.json";private static final String SPEAKERS_JSON_FILE_NAME = "speakers.json";private static final String TEST_SPEAKER_JSON = "{\n" + "  \"id\" : 1,\n" + "  \"age\" : 39,\n" + "  \"fullName\" : \"Larson Richard\",\n" + "  \"tags\" : [ \"JavaScript\", \"AngularJS\", \"Yeoman\" ],\n" + "  \"registered\" : true\n" + "}";@Testpublic void serializeObject() {try {ObjectMapper mapper = new ObjectMapper();String[] tags = {"JavaScript", "AngularJS", "Yeoman"};Speaker speaker = new Speaker(1, 39, "Larson Richard", tags, true);String speakerStr = null;mapper.configure(SerializationFeature.INDENT_OUTPUT, true);speakerStr = mapper.writeValueAsString(speaker);    System.out.println(speakerStr);assertTrue(TEST_SPEAKER_JSON.equals(speakerStr));assertTrue(true);} catch (JsonGenerationException jge) {jge.printStackTrace();fail(jge.getMessage());} catch (JsonMappingException jme) {jme.printStackTrace();fail(jme.getMessage());} catch (IOException ioe) {ioe.printStackTrace();fail(ioe.getMessage());}}private File getSpeakerFile(String speakerFileName) throws URISyntaxException {ClassLoader classLoader = Thread.currentThread().getContextClassLoader();URL fileUrl = classLoader.getResource(speakerFileName);URI fileUri = new URI(fileUrl.toString());File speakerFile = new File(fileUri);return speakerFile;}@Testpublic void deSerializeObject() {try {ObjectMapper mapper = new ObjectMapper();File speakerFile = getSpeakerFile(SpeakerJsonFlatFileTest.SPEAKER_JSON_FILE_NAME);Speaker speaker = mapper.readValue(speakerFile, Speaker.class);System.out.println("\n" + speaker + "\n");assertEquals("Larson Richard", speaker.getFullName());assertEquals(39, speaker.getAge());      assertTrue(true);} catch (URISyntaxException use) {use.printStackTrace();fail(use.getMessage());} catch (JsonParseException jpe) {jpe.printStackTrace();fail(jpe.getMessage());} catch (JsonMappingException jme) {jme.printStackTrace();fail(jme.getMessage());} catch (IOException ioe) {ioe.printStackTrace();fail(ioe.getMessage());}}@Testpublic void deSerializeMultipleObjects() {try {ObjectMapper mapper = new ObjectMapper();File speakersFile = getSpeakerFile(SpeakerJsonFlatFileTest.SPEAKERS_JSON_FILE_NAME);JsonNode arrNode = mapper.readTree(speakersFile).get("speakers");List<Speaker> speakers = new ArrayList<Speaker>();if (arrNode.isArray()) {for (JsonNode objNode : arrNode) {System.out.println(objNode);speakers.add(mapper.convertValue(objNode, Speaker.class));}}assertEquals(3, speakers.size());System.out.println("\n\n\nAll Speakers\n");for (Speaker speaker: speakers) {System.out.println(speaker);}System.out.println("\n");Speaker speaker3 = speakers.get(2);assertEquals("Christensen Fisher", speaker3.getFullName());assertEquals(45, speaker3.getAge()); assertTrue(true);} catch (URISyntaxException use) {use.printStackTrace();fail(use.getMessage());} catch (JsonParseException jpe) {jpe.printStackTrace();fail(jpe.getMessage());} catch (JsonMappingException jme) {jme.printStackTrace();fail(jme.getMessage());} catch (IOException ioe) {ioe.printStackTrace();fail(ioe.getMessage());}}}

之前的测试用例均使用了JUnit中的断言方法来测试JSON序列化/反序列化的结果。

对于以上的JUnit单元测试,以下几点值得一提:

  • serializeObject()方法创建了一个Speaker对象,然后使用ObjectMapper.writeValueAsString()和System.out.println()将其序列化并打印到标准输出。测试代码将SerializationFeature、INDENT_OUTPUT设置为true,以优化JSON输出中的缩进和显示。
  • deSerializeObject()方法调用getSpeakerFile()来读取包含speaker对象的JSON输入文件,然后使用ObjectMapper.readValue()将其反序列化为SpeakerJava对象。
  • deSerializeMultipleObjects()方法执行了以下操作:
    • 调用getSpeakerFile()来读取包含speaker对象数组的JSON输入文件。
    • 调用ObjectMapper.readTree()来获取JsonNode对象,该对象指向文件中的JSON文档的根结点。
    • 访问JSON树中的每个结点,并使用ObjectMapper.convertValue()方法将结点中的speaker数据反序列化为Java中的Speaker对象。
    • 打印列表中的所有Speaker对象。
  • getSpeakerFile()方法会查找类路径中相应的文件,并执行以下操作:
    • 从当前执行线程获取ContextClassLoader对象。
    • 使用ClassLoader.getResource()方法从当前类路径中查找相关文件资源。
    • 根据文件名的URI创建FIle对象。

【Java】用Jackson进行JSON序列化/反序列化操作相关推荐

  1. JacksonUtils Jackson的JSON序列化反序列化

    pom.xml添加依赖 <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactI ...

  2. 【JavaScript】在JavaScript中使用JSON进行序列化/反序列化操作

    文章目录 用于stringfy/parse操作的"JSON"对象 JavaScript中简单数据类型的JSON序列化操作 使用toJSON()进行对象的序列化操作 使用eval() ...

  3. 当Java泛型擦除遇到JSON序列化和反序列化

    当Java泛型类型擦除遇到JSON序列化和反序列化 目录 当Java泛型类型擦除遇到JSON序列化和反序列化 前言 测试 前言 -最近看到了Spring 关于 RestTemplate的源码实现又有了 ...

  4. json序列化c语言,C语言JSON序列化/反序列化

    最近想找一个C语言处理嵌套结构体和结构体数组的json库,理想的是能够很容易处理复杂结构体嵌套,并且使用简单的,但是没找到比较合适的,于是打算自己封装一个: 两个问题: C语言结构体本身没有元数据,这 ...

  5. Jackson之JSON序列化和多态反序列化

    SerDe是Serialize/Deserilize的简称,即序列化和反序列化. 一.Jackson之序列化和反序列化 JSON作为一种轻量级的数据交换格式,其清晰和简洁的结构能够轻松地与Java对象 ...

  6. json序列化||反序列化过滤某些属性 之@jsonignore注解

    Jackson相关: 使用Jackson相关的注解时一定要注意自己定义的属性命名是否规范.  命名不规范时会失去效果.(例如Ename ,Eage 为不规范命名."nameE",& ...

  7. json序列化反序列化插件-json2.js 介绍和使用

    json2.js主要功能是做什么的? json2.js提供了json的序列化和反序列化方法,可以将一个json对象转换成json字符串,也可以将一个json字符串转换成一个json对象. json2. ...

  8. JavaScript中的JSON序列化/反序列化

    JSON 1. JSON简介 2. JSON与JS Object区别 3. 对象序列化 3.1 JSON序列化 3.2 JSON反序列化 1. JSON简介 JSON(JavaScript Objec ...

  9. java jackson json_使用Java和Jackson将Json序列化为通用结构而无...

    Jackson数据绑定功能可以使用String键和Object值(也可以是地图或集合)读取Map中的任何json输入.您只是告诉映射器,您想将json读入映射.您可以通过给映射器适当的类型引用来做到这 ...

最新文章

  1. WhyGL:一套学习OpenGL的框架,及翻写Nehe的OpenGL教程
  2. python学习书籍推荐-Python语言之6本机器学习书籍推荐
  3. ASP防SQL注入攻击程序
  4. asp.net ashx 学习总结
  5. ST17H26 SDK中宏定义注意事项
  6. 深入浅出 5种IO模型。
  7. html超文本链接本页面,从HTML语言到网上家园 第三章 超文本链接(1)-网页设计,HTML/CSS...
  8. GRIDVIEW排序 动态实现和静态实现
  9. 网信办:网络音视频等平台不得诱导未成年人参与应援集资等活动
  10. 输入你的密码来连接到_手机怎样连接WiFi?详细步骤,教你操作
  11. VS2015 编译程序时无法查找或打开PDB文件
  12. win10应用商店怎么重新安装?
  13. Mysql SSL 2206错误
  14. [文摘20080311]五笔口诀
  15. mt7620n华硕固件下载_无法安装Windows10,这台电脑磁盘布局不受UEFI固件支持解决方法...
  16. 论程序员如何正确上班摸鱼
  17. 【网络】把路由器用作交换机的方案
  18. 芯片到uboot启动流程 :ROM → MLO(SPL)→ uboot.img
  19. 3000元台式电脑组装配置单2022 3000元组装电脑配置推荐2022
  20. java使用itextpdf将图片转换成pdf的简单实例

热门文章

  1. React- jsx的使用可以渲染html标签 或React组件
  2. grootjs 简明教程
  3. 关于计算机类课程实验教学的思考
  4. ScaleForm十六戒言
  5. 用EnumProcesses()枚举进程
  6. 终端到服务器丢包,服务器丢包 ping的时候产生丢包的解决方法
  7. SpringMVC请求中的普通、POJO、数组集合类型传参与类转换器
  8. python索引例子_Python实现带下标索引的遍历操作示例
  9. python抖音github_使用 Python 下载抖音无水印视频
  10. osm 搭建离线地图_使用离线OSM离线OpenLayers Web应用程序