1.引子

如果你经常从事后端开发,那么一定会遇到各种各样的json数据,并非所有的数据都可以直接按照springboot的映射的默认规则进行映射。

以我的需求为例接受的一个参数可以是

{"event":"SendLinkMsg","to_wxid": "wxid_rxhdmvaefp1922","msg": {"xml" : "dwadadwadadwa","id" : "wxid_rxhdmvaefp1922"}
}

也可能是

{"event":"SendTextMsg","to_wxid": "wxid_rxhdmvaefp1922","msg": "草神真可爱,软软的,嘿嘿嘿"
}

毫无疑问这是两种完全不同的结构,如果直接进行映射的话势必存在一个数据无法映射的情况。

这里我们就会经常使用@JsonDeserializer手动处理参数,而其中的JsonParser则是我们不能不了解的。

那这里我就简单说一下JsonParser的使用方法和简单的运行原理!

2.JsonParser的简单使用和理解

1.使用JsonFactory创建JsonParser

故名思意,jsonFactory就是用于处理json的工厂,它可以把你所指定的json处理成标记的字段,它提供了解析器,让操作者高效率手动处理json成为可能。

String a = "{\n" +"  \"event\":\"SendLinkMsg\",\n" +"  \"to_wxid\": \"wxid_rxhdmvaefp1922\",\n" +"  \"msg\": {\"xml\" : \"dwadadwadadwa\",\"id\" : \"22131\"}";
JsonFactory jsonFactory = new JsonFactory();
JsonParser parser = jsonFactory.createParser(a)

当然也可以通过 createParser()方法传入 Reader, InputStream, URL, byte[] 或 char[] 来解析不同来源的json

这里我们就成功拿到了jsonfactory生成的json解析器。

2.JsonParser的使用:

解析器根据json规则把传入的json切分成带有标记的字段。


字段类型包括

    NOT_AVAILABLE((String)null, -1),START_OBJECT("{", 1),   //公共属性开始END_OBJECT("}", 2),     //公共属性结束START_ARRAY("[", 3),    //数组开始END_ARRAY("]", 4),      //数组结束FIELD_NAME((String)null, 5), //字段名VALUE_EMBEDDED_OBJECT((String)null, 12), VALUE_STRING((String)null, 6),     //字符串值VALUE_NUMBER_INT((String)null, 7), //整数值VALUE_NUMBER_FLOAT((String)null, 8),//浮点值VALUE_TRUE("true", 9), //布尔值 正确VALUE_FALSE("false", 10), //布尔值 错误VALUE_NULL("null", 11); //空值

当我们处理json的时候,根据token标记,当token指针指到结尾的时候,JsonParser就会关闭,我们可以通过parser.isClosed()判断json是否解析到末尾。

parser给了我们很多操作读取字段的方法

currentToken(),nextToken()

用于返回当前token指针对应字段的类型;向右移动指针并且返回移动后的值

getCurrentName,getValueAsString()

获取当前指针对应字段的名字和值的类型。还有其他方法我就不一一阐述了

需要注意的是,当指针指向字段名的时候使用getValueAsString()并不能返回字段名对应的字段值

而指针指向值的时候使用getCurrentName却能获取对应的字段名

当然,我们也可以根据json规则,在字段名类型后面的字段必定是值类型

正确示例

    public static void main(String[] args) {String a = "{\n" +"  \"event\":\"SendLinkMsg\",\n" +"  \"to_wxid\": \"wxid_rxhdmvaefp1922\",\n" +"  \"msg\": {\"xml\" : \"dwadadwadadwa\",\"id\" : \"22131\"}\n" +"}";JsonFactory jsonFactory = new JsonFactory();try (JsonParser parser = jsonFactory.createParser(a)) {System.out.println(parser.currentToken());while(!parser.isClosed()){JsonToken jsonToken = parser.nextToken();if(JsonToken.FIELD_NAME.equals(jsonToken)){String fieldName = parser.getCurrentName();parser.nextToken();System.out.println(fieldName+","+parser.getValueAsString());}}} catch (IOException e) {throw new RuntimeException(e);}}

3:多结构json映射解决思路:

回到最开始的问题,java是不能返回多种参数的,但是我们可以稍微变通下

我们可以把参数封装到一个实体类里,在实体类里多加一个字符串的属性

如果不是字符串的话就正常映射,如果是字符串的话把他打包,装到实体类的一个str属性里

那么字符串json和对象json区别很简单:

正常json是有字段名和json值的

把对应的json值封装即可

而单单读取字符串其实不是json数据的,仅仅会读取到一个value值,把值封装返回即可

    public Msg deserialize(JsonParser parser, DeserializationContext deserializationContext) throws IOException {StringBuilder str = new StringBuilder();String xml = null;String name = null;String path = null;Integer type = null;while(!parser.isClosed()){if (parser.getValueAsString()!=null){System.out.println(parser.getValueAsString());str.append(parser.getValueAsString());}JsonToken jsonToken = parser.nextToken();if(JsonToken.FIELD_NAME.equals(jsonToken)){String fieldName = parser.getCurrentName();parser.nextToken();if ("xml".equals(fieldName)){xml = parser.getValueAsString();} else if("name".equals(fieldName)){name = parser.getValueAsString();} else if ("path".equals(fieldName)){path = parser.getValueAsString();} else if ("type".equals(fieldName)){type = parser.getIntValue();}else {str.append(parser.getValueAsString());}}}Msg msg = new Msg(str.toString(),path,name,xml,type);return  msg;}

1.处理字符串

2.处理对象

至此需求解决,当然代码不够凝练,如果各位大佬有什么更好的思路可以一起分享交流。

json进阶---jackson底层之JsonParser理解使用(springboot多结构参数的映射方法的实现思路)相关推荐

  1. c++类指针赋值表达式必须是可修改的左值_C++进阶教程系列:全面理解C++中的类...

    原标题:C++进阶教程系列:全面理解C++中的类 关注Linux公社 最近刷了一些题,也面试了一些公司,把关于C++中关于类的一些概念总结了一下. 在这里也反思一下,面试前信心满满自以为什么都懂,毫无 ...

  2. Spring Restful Web服务示例 - 使用JSON,Jackson和客户端程序

    Spring Restful Web服务示例 - 使用JSON,Jackson和客户端程序 Spring是最广泛使用的Java EE框架之一.我们之前已经看到了如何使用Spring MVC来创建基于J ...

  3. Java JSON库Jackson 2 x新变化一览

    <Java JSON库Jackson 2.x新变化一览> 作者:chszs,转载需注明. 作者博客主页:http://blog.csdn.net/chszs Jackson库是JSON J ...

  4. JSON之Jackson(一)

    JSON之Jackson(一) JSON之Jackson(二) 1.JSON简介 JSON的全称是JavaScript Object Notation,是一种轻量级的数据交换格式. JSON与 XML ...

  5. BlockChain:Python一步一步实现(流程最清楚)区块链底层技术流程图(理解一目了然,值得收藏)

    BlockChain:Python一步一步实现(流程最清楚)区块链底层技术流程图(理解一目了然,值得收藏) 导读 基于Python编程,实现一步一步实现(流程最清楚)区块链底层技术流程图,理解一目了然 ...

  6. JSON进阶第二篇 AJAX方式传递JSON数据

    上一篇<JSON进阶第一篇 在PHP与javascript 中使用JSON>示范了在PHP和javascript中如何使用JSON类型的数据,本篇将介绍用AJAX方式得到JSON数据从而动 ...

  7. iPhone开发进阶(1) --- 深入理解iPhone OS/SDK与Objective-C 2.0

    iPhone开发进阶(1) --- 深入理解iPhone OS/SDK与Objective-C 2.0 工欲善其事,必先利其器.在开发iPhone应用程序的时候,深入理解iPhone OS/SDK与O ...

  8. 两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)

    本篇文章主要介绍了"两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)",主要涉及到两款JSON类库Jackson与JSON-lib的性能对比(新增第三款 ...

  9. Android系统 (190)---Android:JSON 简介 amp; 解析方式 讲解(Gson、AS自带org.json、Jackson)

    Android:JSON 简介 & 解析方式 讲解(Gson.AS自带org.json.Jackson) 前言 现今最主流的数据交换格式 非 JSON莫属 今天,我将全面介绍 JSON &am ...

最新文章

  1. The Pediatric Cancer Genome Project   儿童癌症基因组计划
  2. java定义set_java – “方法流()未定义类型Set”
  3. java逆向基础,Java逆向基础之函数
  4. BZOJ 2734 [HNOI2012]集合选数 (状压DP、时间复杂度分析)
  5. python 安卓app按钮数字识别_Python 手写数字识别-knn算法应用
  6. MYSQL深潜 - 剖析Performance Schema内存管理
  7. Python md5 sha1 的使用
  8. 史上最大漏洞危机再生新变种,大量芯片受感染
  9. android html 换行_android TextView怎么设置个别字体颜色并换行?
  10. 沫沫金::struts下载文档[解决方案]
  11. 如何在Docker中安装MySQL
  12. oracle中decode函数,行转列
  13. Android内核剖析pdf
  14. 黑链 明链 暗链 简介
  15. 咸鱼笔记:《实用软件工程》第一、二章课后简答题及参考答案
  16. .Net Framework 4 如何静默安装
  17. scheme 中文教程
  18. MYSQL不能远程连接
  19. Dell/R730XD sas盘 raid0与JBOD性能比较
  20. 请19级的童鞋们接收一下

热门文章

  1. 读写csv,xlsx文件的工具类
  2. 论文查重图片会不会算重复率?
  3. 矩阵论 - 7 - 求解Ax=0:主变量、特解
  4. eclipse 3.7(indigo)在线安装中文语言包
  5. git 强制同步远端仓库
  6. android4.4 电池管理
  7. 微信小程序入门(登录页面)
  8. 室内导航--机器视觉、ROS、Goseek(二)Ubuntu 20.04 LTS 准备
  9. Linux下重要日志及查看方式
  10. Mysql视图和触发器