【工作代码】复杂 JSON 值替换处理
总结下最近的工作遇到的点:
入参复杂 JSON 层层嵌套,Java 怎么优雅的处理。
一、关于 JSON
JSON 是类似 XML 用于存储和交互文本信息。但优于 XML ,其更小,更快,更易懂和解析。其是一个无序的”名称/值”对的集合。由
|
1
2
3
4
5
|
{ 左括号"" 名称 String:值} 右括号 |
组成。然后 名称值对 以逗号分隔。

二、场景描述
是一个正则匹配替换的操作。一个很长很复杂的 JSON 入参,通过正则匹配其 content 对应的值中的图片地址并替换。
三、思考
框架选型 – fastjson
(fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发。)
a . 思路
Java 是面向对象的语言。我要利用 fastjson 把复杂的 JSON 写出其对应的 BO 对象,然后正则替换 content 内容(即 operatorContent 方法),然后重新生成 JSON 响应。即下面代码操作:
|
1
2
3
|
OperatorBO operatorBO = JSON.parseObject(jsonString, OperatorBO.class);operatorBO.setContent(operatorContent(operatorBO.getContent()));String newJsonString = JSON.toJSONString(operatorBO); |
好处:代码易读,容易维护
坏处:BO 实在是太复杂,而且很多数组嵌数组。PHP -> Java 服务化过程中很多不可控,容易出 BUG。
涉及的API :
序列化对象到 JSON:
|
1
|
String jsonString = JSON.toJSONString(obj); |
反序列化 JSON 到对象:
|
1
|
VO vo = JSON.parseObject("...", VO.class); |
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!
b . 思路
只是替换操作,所以不用太考虑代码易读性。直接利用 fastjson 直接转出 JSONArray 对象,然后操作该对象即可。JSONArray 对象本质就是一个 List<Object> 如下代码:
|
1
2
3
4
|
public class JSONArray extends JSON { private final List<Object> list; protected transient Object relatedArray;} |
具体伪代码如下:
|
1
2
3
4
5
|
String jsonString = "[{" + "\"content\":\"content value 1\"" + "}]";JSONArray itemDataJsonArr = JSON.parseArray(jsonString);String content = itemDataJsonArr.getJSONObject(0).getString("content");content = content + "23";itemDataJsonArr.getJSONObject(0).put(CONTENT,content); |
好处:不用关心其他复杂的键值对,目标只关注要替换的节点名称。
坏处:代码不易读,相对也还容易维护。
涉及的API :
替换对应的节点名称的值:
|
1
|
JSONObject.put("...",value); |
反序列化 JSON 到 JSONArray 对象:
|
1
|
JSONArray jSONArray = JSON.parseObject("..."); |
思路 c d e …
四、小结
根据服务化场景,在不确定入参 JSON 的复杂度情况下,选择了思路 b.这篇其实是工作上的小小结。任何技术,任何框架的 API 是否好用优雅,是具体场景决定的。
如以上文章或链接对你有帮助的话,别忘了在文章结尾处评论哈~ 你也可以点击页面右边“分享”悬浮按钮哦,让更多的人阅读这篇文章。
【工作代码】复杂 JSON 值替换处理的更多相关文章
- python3.6从含有html代码的json的中取出某个值
python3.6从含有html代码的json的中取出某个值 之前在做接口测试的时候,网站的后端是用java写的,然后接口的response返回的都是json格式,json很简单,就是字典,类似这样子 ...
- bootstrap selectpicker 通过代码指定选中值 BootStrap selectpicker后台动态绑定数据 selectpicker 获取选中option的属性或者值
bootstrap-select使用 bootstrap selectpicker 通过代码指定选中值 $('#subjectno').selectpicker('val',(row.subjectn ...
- .net和MVC中的json值和List<T>和DataTable的一些转换
1.List<T>集合转换为Json值 List<ReportModel> dtList = new List<ReportModel>(); JsonResult ...
- 【SQL】Update中使用表别名、如何用表中一列值替换另一列的所有值
Update中使用表别名 select中的表别名: select * from TableA as ta update中的表别名: update ta from TableA as ta 如何用表中一 ...
- SQL SERVER将某一列字段中的某个值替换为其他的值 分类: MSSQL 2014-11-05 13:11 67人阅读 评论(0) 收藏
SQL SERVER将某一列字段中的某个值替换为其他的值 UPDATE 表名 SET 列名 = REPLACE(列名 ,'贷','袋') SQL SERVER"函数 replace 的参数 ...
- EasyUI - 一般处理程序 返回 Json值
使用 一般处理程序(ashx)返回Json值. 原始Json数组的格式: [ { ", "name":"张三", "sex":&q ...
- gcc -D 传值给代码,默认值为1
gcc -D 传值给代码,默认值为1 -D 参数可以给代码中的宏打开一扇门.简单的代码#include <stdio.h> #ifdef WHO #define NAME "jo ...
- mssql sqlserver 将字段null(空值)值替换为指定值的三种方法分享
摘要: 下文将分享两种将字段中null值替换为指定值的方法分享,如下所示: 实验环境:sqlserver 2008 R2 例: )) go insert into test(info)values(' ...
- data.frame类型数据如何将第一列值替换为行号
data.frame类型数据如何将第一列值替换为行号 row.names(data) <- data[, 1]data <- data[, -1]
随机推荐
- Arcgis for Javascript 出现“init.js->TypeError: f is not a function”
环境 采用离线JS包,版本为v3.8 问题描述 在为map添加了 app.map.on("pan-start", this.showHandBeignPan()); 在拖动地图的时 ...
- Free download
http://blogs.msdn.com/b/mssmallbiz/archive/2014/07/07/largest-collection-of-free-microsoft-ebooks-ev ...
- servlet+jsp+java实现Web 应用
servlet+jsp+java实现Web 应用 用java来构建一个web应用是特别容易的事情,jsp和php很像,可以嵌套在html中.程序的结构很简单,也很清楚,本文主要记录下大概的开发过程和环 ...
- SQL关于日期的查询
SQL查询某天的记录: datediff(day,[Datetime],'2012-08-03')=0 把Datetime换为你的相应字段: SQL查询今天的记录: datediff(day,[Dat ...
- 我的fckeditor实践
一开始我不懂这个ConnectorServlet是何用处,后来发现是专门用于文件上传的,因为fckeditor默认是不支持这个功能的. ConnectorServlet: /* * FCKeditor ...
- Mac上搭建直播服务器Nginx+rtmp
简介 nginx是非常优秀的开源服务器,用它来做hls或者rtmp流媒体服务器是非常不错的选择,本人在网上整理了安装流程,分享给大家并且作备忘. 步骤安装 1.安装Homebrow Homebrew简 ...
- js时间函数
时间 new Date() 获取时间,可以理解为是系统默认的函数. 从小括号里面获取系统时间日期,相当于在调用系统默认的函数. 年 getFullYear() 注意,有Full. 月 getMonth ...
- javaweb回顾第六篇谈一谈Servlet线程安全问题
前言:前面说了很多关于Servlet的一些基础知识,这一篇主要说一下关于Servlet的线程安全问题. 1:多线程的Servlet模型 要想弄清Servlet线程安全我们必须先要明白Servlet实例 ...
- UIScrollView offset in UINavigationController
转:UIScrollView offset in UINavigationController 通过设置viewCtronller的 self.automaticallyAdjustsScrollVi ...
- 报错:ASP.NET Web API中找不到与请求匹配的HTTP资源
当发出GET请求: GET http://localhost:54176/api/Products 报如下错: { "message": "找不到与请求 URI“htt ...