提交 73f92139 编写于 作者: W wizardforcel

2020-06-14 16:25:19

上级 366da669
# Jackson 将对象转换为 json 并将 json 转换为对象
> 原文: [https://howtodoinjava.com/jackson/jackson-convert-object-to-from-json/](https://howtodoinjava.com/jackson/jackson-convert-object-to-from-json/)
**Jackson** *将对象转换为 JSON* 示例,*将 json 转换为对象*示例。 学习使用 jackson `objectmapper`从 json 字符串填充 Java 对象,并从 java 对象写入 json 字符串。
Jackson 用于**将 Java 对象转换为 json** ,并**将 json 转换为 Java 对象**。 在这个快速的 **jackson 教程**中,我给出了将 Java 对象以编程方式转换为 json 的示例。
```java
Table of Contents
1\. Jackson maven dependency
2\. Convert Java object to JSON
3\. Pretty print JSON
4\. Convert JSON to Java object
```
在进入代码示例之前,让我们定义一个简单的 pojo 类,我们将在此示例中使用该类进行转换。
```java
public class Employee
{
private Integer id;
private String firstName;
private String lastName;
public Employee(){
}
public Employee(Integer id, String firstName, String lastName, Date birthDate){
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
}
//Getters and setters
@Override
public String toString()
{
return "Employee [id=" + id + ", firstName=" + firstName + ", " +
"lastName=" + lastName + "]";
}
}
```
## 1.Jackson 依赖
您可以通过两种方式添加 Jackson 依赖项,具体取决于您的项目类型。
#### 1.1 基于 Maven 的项目
`pom.xml`文件中添加以下依赖项。
```java
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.6</version>
</dependency>
</dependencies>
```
#### 1.2 对于 ANT 或其他项目类型
对于非 Maven 用例,可以从 [Maven 中央仓库](https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/)下载 jar。
## 2.Jackson `ObjectMapper`
`ObjectMapper`是用于数据绑定的主要 API。 它带有几种读取器/写入器方法,以执行从 Java 到 JSON 的转换。 它将使用`JsonParser``JsonGenerator`的实例来实现 JSON 的实际读取/写入。
#### 2.1 将 json 转换为对象的语法
使用以下示例语法读取 JSON 并填充 Java 对象。
```java
ObjectMapper mapper = new ObjectMapper();
Object value = mapper.readValue(jsonSource , javaObject);
```
* `jsonSource` – 将获取 json 字符串的输入源。
* `javaObject` – 需要填充的目标 Java 对象。
#### 2.2 将对象转换为 json 的语法
使用以下示例语法将 Java 对象写入 json 字符串。
```java
ObjectMapper mapper = new ObjectMapper();
Object value = mapper.writeValue(jsonTarget, javaObject);
```
* `jsonTarget` – 将写入 json 字符串的输出目标。
* `javaObject` – 需要转换为 json 的源 Java 对象。
## 3\. Jackson 将对象转换为 JSON
要转换雇员对象并将其写入某个文件,可以使用以下代码。
```java
package test.jackson;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
public class JavaToJSONExample
{
public static void main(String[] args)
{
@SuppressWarnings("deprecation")
Employee employee = new Employee(1, "Lokesh", "Gupta", new Date(1981,8,18));
ObjectMapper mapper = new ObjectMapper();
try
{
mapper.writeValue(new File("c://temp/employee.json"), employee);
} catch (JsonGenerationException e)
{
e.printStackTrace();
} catch (JsonMappingException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
```
程序输出。
```java
{"id":1,"firstName":"Lokesh","lastName":"Gupta"}
```
## 4\. Jackson 精美打印 JSON 输出
如果看上面的输出,那么写在文本文件中的输出是非常原始的并且没有格式化。 您可以使用`writerWithDefaultPrettyPrinter`而不是`defaultPrettyPrintingWriter()`实例编写格式化的 JSON 内容,如下所示:
```java
package test.jackson;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
public class JavaToPrettyJSONExample
{
public static void main(String[] args)
{
@SuppressWarnings("deprecation")
Employee employee = new Employee(1, "Lokesh", "Gupta", new Date(1981,8,18));
ObjectMapper mapper = new ObjectMapper();
try
{
mapper.defaultPrettyPrintingWriter().writeValue(new File("c://temp/employee.json"), employee);
} catch (JsonGenerationException e)
{
e.printStackTrace();
} catch (JsonMappingException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
```
程序输出:
```java
{
"id" : 1,
"firstName" : "Lokesh",
"lastName" : "Gupta"
}
```
## 5\. Jackson 将 JSON 转换为 Java 对象
要将 json 字符串转换为 java 对象(例如`Employee`对象),请使用以下代码:
```java
package test.jackson;
import java.io.File;
import java.io.IOException;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
public class JSONToJavaExample
{
public static void main(String[] args)
{
Employee employee = null;
ObjectMapper mapper = new ObjectMapper();
try
{
employee = mapper.readValue(new File("c://temp/employee.json"), Employee.class);
} catch (JsonGenerationException e)
{
e.printStackTrace();
} catch (JsonMappingException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
System.out.println(employee);
}
}
```
程序输出:
```java
Employee [id=1, firstName=Lokesh, lastName=Gupta]
```
确保在 POJO 类中定义了默认的构造器(例如,本例中为`Employee.java`)。 Jackson 使用默认构造器通过反射来创建 Java 类的实例。 如果没有提供默认的构造器,那么您将在运行时得到`JsonMappingException`
学习愉快!
\ No newline at end of file
# Jackson 教程
\ No newline at end of file
+ [JMS 教程](2.md)
+ [JMS 教程 – Java 消息服务教程](3.md)
+ [JMS 点对点消息示例](4.md)
+ [JMS 发布/订阅消息示例](5.md)
+ [HornetQ 教程](6.md)
+ [HornetQ 单体 – 基本的 JMS 消息传递示例](7.md)
+ [使用 Maven 的 HornetQ 独立服务器示例](8.md)
+ [Spring3 Hornetq 独立集成示例](9.md)
+ [Gson 教程](10.md)
+ [Gson 教程](11.md)
+ [Gson 安装](12.md)
+ [GSON – 序列化和反序列化 JSON](13.md)
+ [Gson – JSON 输出的精美打印](14.md)
+ [GSON – 将 JSON 数组解析为 Java 数组或列表](15.md)
+ [GSON – 序列化和反序列化 JSON 为集](16.md)
+ [Gson – 序列化和反序列化包含自定义对象的`HashMap`](17.md)
+ [Gson – `GsonBuilder`配置示例](18.md)
+ [Gson - 序列化`NULL`值](19.md)
+ [Gson `@Since` – 版本支持](20.md)
+ [Gson `@SerializedName`](21.md)
+ [Gson – 排除或忽略字段](22.md)
+ [Gson - `JsonReader`](23.md)
+ [Gson - `JsonParser`](24.md)
+ [Gson – 自定义序列化和反序列化](25.md)
+ [Gson – 快速指南](26.md)
+ [JAXB 教程](28.md)
+ [JAXB 注解](29.md)
+ [JAXB `@XmlRootElement`注解示例](30.md)
+ [JAXB `@XmlElementWrapper`注释示例](31.md)
+ [JAXB `Marshaller`(编组器)示例](32.md)
+ [JAXB `Unmarshaller`(解组器)示例](33.md)
+ [JAXB 读取 XML 到 Java 对象的示例](34.md)
+ [使用 Moxy 和 Jaxb 将 JSON 转换为 Java 对象的示例](35.md)
+ [JAXB 将 Java 对象写入 XML 的示例](36.md)
+ [JAXB 将对象转换为 JSON 的示例](37.md)
+ [JAXB – 在 Java 中编组和解组`HashMap`](38.md)
+ [JAXB – 编组和解组对象列表或集合](39.md)
+ [使用 Eclipse 从 JAXB Java 类生成 XSD](40.md)
+ [JAXB 模式验证](41.md)
+ [[已解决]:`javax.xml.bind.JAXBException`:`java.util.ArrayList`或其任何超类不是此上下文的已知类](42.md)
+ [[已解决]:线程“`main`”`com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException`中的异常:3 个`IllegalAnnotationExceptions`计数](43.md)
+ [没有`@XmlRootElement`的 JAXB 编组 – 缺少`@XmlRootElement`错误](44.md)
+ [不带 jaxb 注解的解组](45.md)
+ [Jackson 教程](27.md)
+ [Jackson2 – 将 Java 对象转换为 JSON,并将 JSON 字符串转换为对象](46.md)
+ [Jackson 将对象转换为 json 并将 json 转换为对象](47.md)
+ [Jackson – 将 JSON 转换为`Map`并将`Map`转换为 JSON](48.md)
+ [Java XML 教程](49.md)
+ [Java 读取 XML – Java DOM 解析器示例](50.md)
+ [Java SAX 解析器 – 读取 XML 的示例](51.md)
+ [Java JDOM2 – 阅读 XML 示例](52.md)
+ [使用 Java StAX 解析器读取 XML – 游标和迭代器 API](53.md)
+ [DOM 与 Java 中的 SAX 解析器](54.md)
+ [Java 将 XML 转换为属性 – 从 XML 文件读取属性](55.md)
+ [Java 将属性文件转换为 XML 文件](56.md)
+ [Java 字符串到 XML – 将字符串解析为 XML DOM 示例](57.md)
+ [Java XML 转换为字符串 – 将 XML 对象写入文件示例](58.md)
+ [Java XPath 示例 – XPath 教程](59.md)
+ [Java xpath 示例 – 在 xml 文件上求值 xpath](60.md)
+ [Java8 xpath 示例 – 在字符串上求值 xpath](61.md)
+ [Java XPath 表达式示例](62.md)
+ [Java XPath `NamespaceContext` – 命名空间解析示例](63.md)
+ [Java XPath 从 XML 获取属性值](64.md)
+ [在 Java 中使用 xpath 查找具有属性值的 xml 元素](65.md)
+ [Java XPath – 检查节点或属性是否存在?](66.md)
+ [Eclipse 教程](67.md)
+ [在 Eclipse 中导入 Maven 远程原型目录](68.md)
+ [使用 Eclipse 快速搜索插件进行更快的文本搜索](69.md)
+ [如何在 Eclipse 中显示非英文 unicode(例如中文)字符](70.md)
+ [如何在 Eclipse 中增加控制台输出限制](71.md)
+ [创建 Eclipse 模板以加快 Java 编程](72.md)
+ [在 5 分钟内使 Eclipse 更快](73.md)
+ [如何在印地语中编译和运行 Java 程序](74.md)
+ [Java 覆盖最终静态方法 – 方法是覆盖还是隐藏?](75.md)
+ [[已解决] 在 Eclipse 的 Java 构建路径中找不到超类“`javax.servlet.http.HttpServlet`”](76.md)
+ [版本控制系统教程](77.md)
+ [分布式版本控制系统如何工作?](78.md)
+ [版本控制系统(VCS)如何工作?](79.md)
+ [如何从 Google Code 项目中签出源代码](80.md)
+ [Tomcat 教程](81.md)
+ [Tomcat – 架构和`server.xml`配置](82.md)
+ [如何在默认的 HTTP 端口 80 中运行 tomcat](83.md)
+ [Tomcat – 启用/禁用目录列表](84.md)
+ [Tomcat SSL 或 HTTPS 配置示例](85.md)
+ [通过单个服务器安装运行 Tomcat 的多个实例](86.md)
+ [Tomcat Maven 插件示例](87.md)
+ [Spring,Tomcat – 获取负载均衡器后面的真实 IP](88.md)
+ [Web 服务器如何工作?](89.md)
+ [Linux 教程](90.md)
+ [JStack 线程转储分析器](91.md)
+ [使用 Java 在 Linux 中管理系统日志文件不超过 N GB](92.md)
+ [Swagger – Spring REST 示例](93.md)
+ [GoF 设计模式](94.md)
+ [设计模式](95.md)
+ [创建型设计模式](96.md)
+ [Java 单例模式介绍](97.md)
+ [Java 中的构建器设计模式](98.md)
+ [Java 工厂模式说明](99.md)
+ [抽象工厂模式解释](100.md)
+ [Java 中的原型设计模式](101.md)
+ [行为型设计模式](102.md)
+ [责任链设计模式](103.md)
+ [命令设计模式](104.md)
+ [迭代器设计模式](105.md)
+ [中介者设计模式](106.md)
+ [备忘录设计模式](107.md)
+ [观察者设计模式](108.md)
+ [状态设计模式](109.md)
+ [策略设计模式](110.md)
+ [模板方法设计模式](111.md)
+ [访问者设计模式示例](112.md)
+ [结构型设计模式](113.md)
+ [Java 中的适配器设计模式](114.md)
+ [桥接设计模式](115.md)
+ [组合设计模式](116.md)
+ [Java 中的装饰器设计模式](117.md)
+ [外观设计模式](118.md)
+ [享元设计模式](119.md)
+ [代理设计模式](120.md)
+ [设计原则](121.md)
+ [Java 中的 SOLID 原则(含示例)](122.md)
+ [开闭原则](123.md)
+ [单一责任原则](124.md)
+ [Java 最佳实践](125.md)
+ [Java 最佳实践指南](126.md)
+ [编写好的单元测试的 FIRST 原则](127.md)
+ [您应该如何对 DAO 层进行单元测试](128.md)
+ [JUnit 最佳实践指南](129.md)
+ [不良单元测试用例的 8 个迹象](130.md)
+ [20 个 Java 异常处理最佳实践](131.md)
+ [13 个编写 Spring 配置文件的最佳实践](132.md)
+ [Java Web 应用性能改进技巧](133.md)
+ [Java 算法](134.md)
+ [Java 算法和实现](135.md)
+ [冒泡排序 Java 示例](136.md)
+ [插入排序 Java 示例](137.md)
+ [归并排序 Java 示例](138.md)
+ [快速排序 Java 示例](139.md)
+ [选择排序 Java 示例](140.md)
+ [Java AES 加密解密示例](141.md)
+ [使用 Soundex 算法实现语音搜索](142.md)
+ [Java 比较和交换示例 – CAS 算法](143.md)
+ [Python 教程](144.md)
+ [Python 教程](145.md)
+ [如何在 Sublime 编辑器中安装 Python 包](146.md)
+ [Python – 注释](147.md)
+ [Python – 变量](148.md)
+ [Python – 数据类型](149.md)
+ [Python – 关键字](150.md)
+ [Python – 字符串](151.md)
+ [Python – 列表](152.md)
+ [Python – 元组](153.md)
+ [Python `max()`和`min()`– 在列表或数组中查找最大值和最小值](154.md)
+ [Python 找到 N 个最大的或最小的项目](155.md)
+ [Python 读写 CSV 文件](156.md)
+ [Python `httplib2` – HTTP GET 和 POST 示例](157.md)
+ [Python 将元组解包为变量或参数](158.md)
+ [Python 解包元组 – 太多值无法解包](159.md)
+ [Python 多重字典示例 – 将单个键映射到字典中的多个值](160.md)
+ [Python `OrderedDict` – 有序字典](161.md)
+ [Python 字典交集 – 比较两个字典](162.md)
+ [Python 优先级队列示例](163.md)
+ [RxJava 教程](164.md)
+ [完整的 Java Servlet 教程](165.md)
+ [vaadin 教程](166.md)
+ [使用 Maven 的 vaadin HelloWorld Web 应用](167.md)
+ [Vaadin `ComboBox`示例](168.md)
+ [vaadin 文本字段示例](169.md)
+ [Vaadin Spring Security BasicAuth 示例](170.md)
+ [SQL 教程](171.md)
+ [SQL – 不使用临时表删除重复行](172.md)
+ [查找员工的第 N 高薪的 SQL 查询](173.md)
+ [`SQLException`:用户`root@localhost`的访问被拒绝](174.md)
+ [Struts2 教程](175.md)
+ [Struts2 HelloWorld 示例](176.md)
+ [Struts2 HelloWorld 注解示例](177.md)
+ [使用`@InterceptorRef`的 Struts2 自定义拦截器示例](178.md)
+ [Struts2 – 如何正确设置结果路径](179.md)
+ [Spring4 + Struts2 + Hibernate 集成教程](180.md)
+ [[已解决] 无法找到`ref-name`引用的拦截器类](181.md)
+ [[已解决]:找不到扩展名`properties`或`xml`的结果类型](182.md)
+ [数据结构教程](183.md)
+ [使用数组的 Java 栈实现](184.md)
+ [Java 中的自定义列表实现示例](185.md)
+ [HTML5 教程](186.md)
+ [HTML5 – `<section>`标签示例](187.md)
+ [HTML5 字符集 – 字符编码声明](188.md)
+ [HTML5 `DOCTYPE`声明示例](189.md)
+ [Java 题目](190.md)
+ [Java 面试题目与答案](191.md)
+ [Java 中的无效代码和无法访问的代码](192.md)
+ [Java 字符串回文 – Java 数字回文示例](193.md)
+ [检测`LinkedList`中的无限循环的示例](194.md)
+ [复合赋值运算符`i += j`与 Java 中的`i = i + j`不同](195.md)
+ [Java 中的 HiLo 猜谜游戏](196.md)
+ [Java 题目 – 查找所有重复的元素](197.md)
+ [Java 题目 – `TreeMap`的放置操作](198.md)
+ [题目 – 返回所有字符串中的第 N 长字符串](199.md)
+ [Java 题目:好的字符串 – 坏的字符串](200.md)
+ [题目 – 检查字符串是否完整(包含所有字母)](201.md)
+ [Java 中的反转字符串 - 单词反转字符串](202.md)
+ [用 Java 计算阶乘的 3 种方法](203.md)
+ [Java 中的 FizzBu​​zz 解决方案](204.md)
+ [从 Java 中的序列/数组中查找缺失的数字](205.md)
+ [Java – 不使用“`new`”关键字创建对象](206.md)
+ [面试问题](207.md)
+ [Java 面试问题](208.md)
+ [Java 字符串面试问题与答案](210.md)
+ [Java 核心面试问题 – 第 1 部分](211.md)
+ [Java 核心面试问题 – 第 2 部分](212.md)
+ [Java 核心面试问题 – 第 3 部分](213.md)
+ [Java 面试的 40 个热门问答集](214.md)
+ [中级开发人员的 Java 面试问题](215.md)
+ [针对 Oracle 企业管理器项目的实际 Java 面试问题](216.md)
+ [`HashMap`和`ConcurrentHashMap`面试问题](217.md)
+ [Java 版本和新特性](218.md)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册