Java中Jackson库操作json的基本操作

article/2025/10/27 22:58:27

这段工作中总会遇到使用Java处理JSON的情况,大部分都使用的是开源工具Jackson实现的。因此总结一下发上来,希望对看到的人有所帮助。

上一篇文档中,我已经讲过Java如何使用Jackson来对Json进行序列化,这边我再稍微回顾一下。

Jackson中有个ObjectMapper类很是实用,用于Java对象与JSON的互换。
1、Java对象转换为JSON:
User user=new User(); //Java Object
ObjectMapper mapper = new ObjectMapper();
mapper.writeValueAsString(user); //返回字符串
//输出格式化后的字符串(有性能损耗)
mapper.defaultPrettyPrintingWriter().writeValueAsString(user);
mapper.writeValue(new File("c:\\user.json"), user); //指定文件写入
//设置序列化配置(全局),设置序列化时不输出空值.
sharedMapper.getSerializationConfig().setSerializationInclusion(Inclusion.NON_NULL);

2、JSON反序列化为Java对象:
ObjectMapper mapper = new ObjectMapper();
//解析器支持解析单引号
mapper.configure(Feature.ALLOW_SINGLE_QUOTES,true);
//解析器支持解析结束符
mapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS,true);
HashMap jsonMap = mapper.readValue(json,HashMap.class); //转换为HashMap对象



下面讲解一下Jackson对Json的基本操作:

Map转换为json

package com.pcmall;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;public class Map2Json {/** * Map 转换为 json */ public static void MyTest01()  {  Map<String, String> hashMap = new HashMap<String, String>();  hashMap.put("name", "zhang");  hashMap.put("sex", "1");  hashMap.put("login", "Jack");  hashMap.put("password", "123abc");  try  {  ObjectMapper objectMapper = new ObjectMapper();  String userMapJson = objectMapper.writeValueAsString(hashMap);  JsonNode node = objectMapper.readTree(userMapJson);  // 输出结果转意,输出正确的信息  System.out.println(node.get("password").asText());  // 输出不转意,输出结果会包含"",这是不正确的,除非作为json传递,如果是输出结果值,必须如上一行的操作  System.out.println(node.get("name"));  }  catch (IOException e)  {  }  }  public static void main(String[] args){MyTest01();}
}

输出结果如下:

123abc
"zhang"


解析json格式字符串

package com.pcmall;import java.io.IOException;import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;public class ResolveJson {/** * 解析 json 格式字符串 */  public static void MyTest02()  {  try  {  String str = "{\"data\":{\"birth_day\":7,\"birth_month\":6},\"errcode\":0,\"msg\":\"ok\",\"ret\":0}";  ObjectMapper mapper = new ObjectMapper();  JsonNode root = mapper.readTree(str);  JsonNode data = root.path("data");  JsonNode birth_day = data.path("birth_day");  System.out.println(birth_day.asInt());  JsonNode birth_month = data.path("birth_month");  System.out.println(birth_month.asInt());  JsonNode msg = root.path("msg");  System.out.println(msg.textValue());  }  catch (IOException e)  {  }  }  public static void main(String[] args){MyTest02();}
}
输出结果如下:

7
6
ok


json直接提取值

package com.pcmall;import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;public class GetPartJson {/** * json 直接提取 值 */  public static void MyTest03()  {  try  {  // 演示字符串  String str = "{\"data\":{\"hasnext\":0,\"info\":[{\"id\":\"288206077664983\",\"timestamp\":1371052476},{\"id\":\"186983078111768\",\"timestamp\":1370944068},{\"id\":\"297031120529307\",\"timestamp\":1370751789},{\"id\":\"273831022294863\",\"timestamp\":1369994812}],\"timestamp\":1374562897,\"totalnum\":422},\"errcode\":0,\"msg\":\"ok\",\"ret\":0,\"seqid\":5903702688915195270}";  ObjectMapper mapper = new ObjectMapper();  JsonNode root = mapper.readTree(str);  // 提取 data  JsonNode data = root.path("data");  // 提取 info  JsonNode info = data.path("info");  System.out.println(info.size());  // 得到 info 的第 0 个  JsonNode item = info.get(0);  System.out.println(item.get("id"));  System.out.println(item.get("timestamp"));  // 得到 info 的第 2 个  item = info.get(2);  System.out.println(item.get("id"));  System.out.println(item.get("timestamp"));  // 遍历 info 内的 array  if (info.isArray())  {  for (JsonNode objNode : info)  {  System.out.println(objNode);  }  }  }  catch (Exception e)  {  }  }  public static void main(String[] args){MyTest03();}
}
输出结果如下:

4
"288206077664983"
1371052476
"297031120529307"
1370751789
{"id":"288206077664983","timestamp":1371052476}
{"id":"186983078111768","timestamp":1370944068}
{"id":"297031120529307","timestamp":1370751789}
{"id":"273831022294863","timestamp":1369994812}


创建一个Json,并向该json添加内容

package com.pcmall;import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;public class CreateJson {/** * 创建一个 json,并向该 json 添加内容 */  public static void MyTest04()  {  try  {  ObjectMapper mapper = new ObjectMapper();  ObjectNode root1 = mapper.createObjectNode();  root1.put("nodekey1", 1);  root1.put("nodekey2", 2);  System.out.println(root1.toString());  //Create the root node  ObjectNode root = mapper.createObjectNode ();  //Create a child node  ObjectNode node1 = mapper.createObjectNode ();  node1.put ("nodekey1", 1);  node1.put ("nodekey2", 2);  //Bind the child nodes  root.put ("child", node1);  //Array of nodes  ArrayNode arrayNode = mapper.createArrayNode ();  arrayNode.add (node1);  arrayNode.add (1);  //Bind array node  root.put ("arraynode", arrayNode);  System.out.println (mapper.writeValueAsString (root));  // 得到的输出信息  // {"child":{"nodekey1":1,"nodekey2":2},"arraynode":[{"nodekey1":1,"nodekey2":2},1]}  }  catch (Exception e)  {  }  }  public static void main(String[] args){MyTest04();}
}
输出结果如下:

{"nodekey1":1,"nodekey2":2}
{"child":{"nodekey1":1,"nodekey2":2},"arraynode":[{"nodekey1":1,"nodekey2":2},1]}

创建一个array node

package com.pcmall;import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;public class CreateNodeArray {// 创建一个 array node  public static void MyTest05()  {  try  {  ObjectMapper mapper = new ObjectMapper();  ArrayNode arrayNode = mapper.createArrayNode();  int i = 0;  // 在 array 内创建 3 组 node 存入 array  for (i = 0; i < 3; i++)  {  // 创建一个 node  ObjectNode node = mapper.createObjectNode();  node.put("nodeA", i);  node.put("nodeB", i);  node.put("nodeC", i);  // 向 array 内添 node  arrayNode.add(node);  }  // 根  ObjectNode root = mapper.createObjectNode();  root.put("total", i);  root.put("rows", arrayNode);  System.out.println(mapper.writeValueAsString(root));  // 得到的输出信息  // {"total":3,"rows":[{"nodeA":0,"nodeB":0,"nodeC":0},{"nodeA":1,"nodeB":1,"nodeC":1},{"nodeA":2,"nodeB":2,"nodeC":2}]}  }  catch (Exception e)  {  e.printStackTrace();  }  }  public static void main(String[] args){MyTest05();}
}
输出结果如下:

{"total":3,"rows":[{"nodeA":0,"nodeB":0,"nodeC":0},{"nodeA":1,"nodeB":1,"nodeC":1},{"nodeA":2,"nodeB":2,"nodeC":2}]}

在添加 array 节点时,put node 的方法已经过时,将使用 set 方法 添加 array 节点,举例:
root.set ("rows", arrayNode);


实际工作中应用

使用Firefox的RESTClient插件进行测试,输入URL,输出如下图所示的结果。


其中基础类如下:

import java.util.Date;public class SaleOrderItem {private String spxx01;private String spxx04;private float lsdi05;private Date lsdi11;private long lsd01;private long lsdi01;private float lsdi02;private String gsxx01;public String getSpxx01() {return spxx01;}public void setSpxx01(String spxx01) {this.spxx01 = spxx01;}public String getSpxx04() {return spxx04;}public void setSpxx04(String spxx04) {this.spxx04 = spxx04;}public float getLsdi05() {return lsdi05;}public void setLsdi05(float lsdi05) {this.lsdi05 = lsdi05;}public Date getLsdi11() {return lsdi11;}public void setLsdi11(Date lsdi11) {this.lsdi11 = lsdi11;}public long getLsd01() {return lsd01;}public void setLsd01(long lsd01) {this.lsd01 = lsd01;}public long getLsdi01() {return lsdi01;}public void setLsdi01(long lsdi01) {this.lsdi01 = lsdi01;}public float getLsdi02() {return lsdi02;}public void setLsdi02(float lsdi02) {this.lsdi02 = lsdi02;}public String getGsxx01() {return gsxx01;}public void setGsxx01(String gsxx01) {this.gsxx01 = gsxx01;}@Overridepublic String toString(){return  spxx04; }
}
业务类使用Spring RestTemplate解析RESTful服务获取到Json,然后调用ObjectMapper对象mapper的readValue(String,TypeReference)方法获取到SaleOrderItem列表。

代码如下 :

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;public class RestWebservice {/** * @param args * @throws IOException * @throws JsonProcessingException * @throws Exception * @throws RestClientException */ public static void main(String[] args) throws JsonProcessingException, IOException{ RestTemplate restTemplate = new RestTemplate();   //get方式*********************************************************************************************************** //参数直接放在URL中 String message = restTemplate.getForObject("http://xxx.xxx.xxx.xxx:8080/pad/interface/poslsd/saleOrderDetail?saleOrder=5078603&gsxx=0001", String.class ); System.out.println(message); List<SaleOrderItem> saleOrderItems = new ArrayList<SaleOrderItem>();ObjectMapper mapper = new ObjectMapper();JsonNode root = mapper.readTree(message);JsonNode data = root.path("data");String strData = data.toString();if(data.isArray()){saleOrderItems = mapper.readValue(strData, new TypeReference<List<SaleOrderItem>>(){});System.out.println(saleOrderItems.size());for(SaleOrderItem item : saleOrderItems){System.out.println(item);}}} 
}
输出结果如下:

{"code":10001,"message":"操作成功","total":1,"data":[{"spxx01":97321,"spxx04":"同方商用主机超越Z400","lsdi05":1.0,"lsdi11":1460044800000,"lsd01":5078603,"lsdi01":507860301,"lsdi02":2999.0,"gsxx01":"0001"}]}
1
同方商用主机超越Z400










http://chatgpt.dhexx.cn/article/GecWePEA.shtml

相关文章

java操作k8s api示例:通过java完成对kubenetes原生资源对象(pod、node、namespace、servcie、deployment)和自定义资源对象CRD的增删改查或事件监听

本文目标 基于官方kubernetes-client/java类库&#xff0c;实现通过java完成对kubenetes原生资源对象&#xff08;pod、node、namespace、servcie、deployment&#xff09;和自定义资源对象&#xff08;如&#xff1a;cluster&#xff09;的增删改查或事件监听&#xff08;wat…

Jackson注解 @JsonCreator

当json在反序列化时&#xff0c;默认选择类的无参构造函数创建类对象&#xff0c;当没有无参构造函数时会报错&#xff0c;JsonCreator作用就是指定反序列化时用的无参构造函数。构造方法的参数前面需要加上JsonProperty,否则会报错。 JsonCreatorpublic Person(JsonProperty(&…

Spring中读取本地json文件,并交给Spring容器管理

我们经常在项目开发中遇到项目数据初始化的问题&#xff0c;例如一些超管&#xff0c;管理员账号&#xff1b;或者地图包&#xff0c;电话号码包&#xff0c;之类的东西。放到到一个json文件里面&#xff08;大的数据字典包可以放到搜索引擎里面&#xff0c;改情况本文不做讨论…

导入jackson-databind依赖后tomcat报错Cannot resolve com.fasterxml.jackson.core:jackson-databind

1》解决步骤&#xff1a; 项目启动前先打开tomcat里面的conf里面的catalina.properties文件夹 如&#xff1a;apache-tomcat-8.5.83\conf\catalina.properties 后面在里面找到如下&#xff1a;红线处 往下找到如下&#xff1a; 将上面的 红波浪线内容添加到后面&#xff1a…

通过Kettle工具解析Json接口数据并且保存到数据库中的详细操作

最近接到一个业务需求&#xff0c;要把一个Json接口数据获取下来并且保存到数据库中&#xff0c;考虑到应用代码实现功能需要耗费一定时间和精力&#xff0c;一旦需要修改&#xff0c;就得重启项目等。于是就选择利用Kettle工具来实现这个业务功能&#xff0c;将其从项目源码中…

树莓派安装wiringpi显示不存在解决方法

环境&#xff1a;树莓派4B 使用sudo apt-get install wiringpi 指令安装wiringpi包时&#xff0c;出现下面的提示&#xff1a; Reading package lists... Done Building dependency tree... Done Reading state information... Done Package wiringpi is not available, but …

[ARM+Linux] 基于wiringPi库的串口通信

wiringOP-master/examples/serialTest.c中&#xff0c;wiringPi库中自带的串口程序&#xff1a; #include <stdio.h> #include <string.h> #include <errno.h>#include <wiringPi.h> #include <wiringSerial.h>int main () {int fd ;int count …

树莓派 Raspberry Pi —— wiringPi库安装

树莓派的GPIO可以像单片机&#xff08;51单片机&#xff0c;Arduino&#xff0c;STM32等&#xff09;一样进行IO控制&#xff08;输出高、低电平&#xff0c;IIC&#xff0c;SPI&#xff0c;串口通信&#xff0c;PWM输出等&#xff09;&#xff0c;在此使用常用的WiringPi库来进…

树莓派 wiringPi 库

wiringPi是一个很棒的树莓派IO控制库&#xff0c;使用C语言开发&#xff0c;提供了丰富的接口&#xff1a;GPIO控制&#xff0c;中断&#xff0c;多线程&#xff0c;等等 检查树莓派是否已安装 wiringPi&#xff0c;在树莓派终端输入&#xff1a; gpio -v // 会在终端中输出…

树莓派安装wiringPi

在学习微雪的2-CH CAN FD HAT时&#xff0c;根据官网步骤在树莓派安装wiringPi sudo apt-get install wiringpi #对于树莓派4B可能需要进行升级&#xff1a; wget https://project-downloads.drogon.net/wiringpi-latest.deb&#xff08;此链接安装可能出错&#xff0c;如果出…

解决wiringPi库与64位树莓派之间不兼容的问题

目录 一.问题现象&#xff1a; 二.解决方案&#xff08;网站&#xff09;可以直接点这下载 一.问题现象&#xff1a; 今天在练习wiringPi库的使用时候&#xff0c;在最后编译的时候出现了这个问题 主要问题是这个skipping incompatible&#xff01; skipping incompatible. …

树莓派安装WiringPi以及找不到wiringPi.h文件解决方法(图文教程)

目录 安装WiringPi 失败的过程&#xff1a; 选择的方法&#xff1a; 安装步骤&#xff1a; 找不到wiringPi.h文件解决方法 失败过程&#xff1a; 解决方法&#xff1a; 安装WiringPi 失败的过程&#xff1a; 通过分别使用sudo apt-get install wiringPi 和 wget https…

树莓派的wiringPi库

一、wiringPi库 树莓派的外设开发都是基于wiringPi库&#xff0c;wiringPi是树莓派IO控制库&#xff0c;使用C语言开发&#xff0c;提供了丰富的接口&#xff1a;GPIO控制&#xff0c;中断&#xff0c;多线程&#xff0c;等等。 wiringPi库的安装 进入 wiringPi的github (htt…

玩转树莓派三、树莓派安装GPIO库接口wiringpi

WiringPi简介 WiringPi 是由 Gordon Henderson 使用 C 语言编写的一个基于 PIN接口的 GPIO 控制函数库&#xff0c;适用于所有Raspberry Pi 中使用的 BCM2835、BCM2836 和 BCM2837 SoC 设备&#xff0c;使用过 Arduino 控制板的开发人员应该会对此非常熟悉。 wiringPi 包括一…

树莓派学习笔记——wiringPi I2C设备使用详解

1.前言 最近认真学习了树莓派&#xff0c;从浅到深认真分析了wiringPi实现代码&#xff0c;借助树莓派学习linux收获颇丰。深入学习linux一段时间后发现它非常有魅力&#xff0c;一个简单的IO口输出操作尽有那么多的“玩法”。wiringPi是一个简单易用的函数库&#xff0c;通过w…

wiringPi简介、安装和管脚说明,官方document

https://www.cnblogs.com/lulipro/p/5992172.html WiringPi API 教程 https://www.rubydoc.info/gems/wiringpi2/2.0.1/WiringPi/GPIO 硬件初始化函数 使用wiringPi时&#xff0c;你必须在执行任何操作前初始化树莓派&#xff0c;否则程序不能正常工作。 可以调用下表函数…

树莓派4B-WiringPi库的安装和使用 (C和Python版)

本文适合&#xff1a;掌握一定的linux常用基本命令&#xff0c;有C或Python编程基础的读者。 有很多入坑树莓派的新手会Python或者C语言&#xff0c;想玩转树莓派上的GPIO硬件资源&#xff0c;但是又不知道从何下手&#xff0c;本文就是一篇让新手入门树莓派GPIO硬件编程的文章…

(转)树莓派wiringPi库详解

https://www.cnblogs.com/lulipro/p/5992172.html <div id"post_detail">树莓派wiringPi库详解 wiringPi是一个很棒的树莓派IO控制库&#xff0c;使用C语言开发&#xff0c;提供了丰富的接口&#xff1a;GPIO控制&#xff0c;中断&#xff0c;多线程&#xf…

树莓派学习笔记——wiringPi GPIO使用详解

1.前言 最近认真学习了树莓派&#xff0c;从浅到深认真分析了wiringPi实现代码&#xff0c;借助树莓派学习linux收获颇丰。深入学习linux一段时间后发现它非常有魅力&#xff0c;一个简单的IO口输出操作尽有那么多的“玩法”。wiringPi是一个简单易用的函数库&#xff0c;通过w…

树莓派在下载Wiringpi时遇到的问题1.软件包 wiringpi 没有可安装候选2.失败:域名解析暂时失败。 wget: 无法解析主机地址 “project-downloads.drogon.ne

项目场景&#xff1a; 最近无聊,在玩实验室的树莓派,在装Wringpi时遇到了一些问题,记录一下 错误1 我用的是树莓派4B,在sudo apt-get install wiringpi时报了如下错误: 正在读取软件包列表… 完成 正在分析软件包的依赖关系树… 完成 正在读取状态信息… 完成 没有可用的软件…