网络传输中利用fastjson将复杂嵌套数据类型Json格式转换(GeoJsonPolygon)
如果一个对象太复杂了,那么在网络传输键的JSON格式数据转换容易出问题。
比如下面一个类Area.java
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.data.mongodb.core.geo.GeoJsonPolygon;@Data @NoArgsConstructor @AllArgsConstructor public class Area {private String name;private GeoJsonPolygon geoJsonPolygon; }
在这个Area类中,有个属性GeoJsonPloygon有点复杂,这个类的源码我就不贴了,只给大家看一下Area对象中包含它的JSON格式数据表示:
{"name": "AAAA","geoJsonPolygon": {"points": [{"x": 3.4,"y": 3.9}, {"x": 6.2,"y": 8.1}, {"x": 9.8,"y": 3.1}, {"x": 3.4,"y": 3.9}],"coordinates": [{"type": "LineString","coordinates": [{"x": 3.4,"y": 3.9}, {"x": 6.2,"y": 8.1}, {"x": 9.8,"y": 3.1}, {"x": 3.4,"y": 3.9}]}],"type": "Polygon"} }
上面红色标识就是GeoJsonPolygon的JSON格式。
这里如果看不懂points和coordinates没关系。
下面模拟一个服务A向另一个服务B,传输泛型为Area的一个List,服务B解析该数据,并返回数据。
服务A的Controller,就是造一个泛型为Area的一个List,通过RestTemplate向B服务传数据。
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.data.geo.Point; import org.springframework.data.mongodb.core.geo.GeoJsonPolygon; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate;import java.util.ArrayList; import java.util.List;@RestController public class SendController {@Autowiredprivate RestTemplate restTemplate;@GetMapping(value = "/send")@ResponseBodypublic List sendArea(){Point point1 = new Point(3.4, 3.9);Point point2 = new Point(6.2, 8.1);Point point3 = new Point(9.8, 3.1);Point point4 = new Point(3.4, 3.9);List<Point> points = new ArrayList<>();points.add(point1);points.add(point2);points.add(point3);points.add(point4);List<Area> areaList = new ArrayList<>();areaList.add(new Area("AAAA",new GeoJsonPolygon(points)));areaList.add(new Area("BBBB",new GeoJsonPolygon(points)));areaList.add(new Area("CCCC",new GeoJsonPolygon(points)));String url = ReceiveController.BASE_URL+ReceiveController.POST_MAPPING;ResponseEntity entity = restTemplate.postForEntity(url, areaList,List.class);List body = (List) entity.getBody();return body;}@Beanpublic RestTemplate restTemplate(){return new RestTemplate();} }
服务B的Controller
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; import org.springframework.data.geo.Point; import org.springframework.data.mongodb.core.geo.GeoJsonPolygon; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList; import java.util.List;@RestController public class ReceiveController {public static final String BASE_URL = "http://localhost:8080";public static final String POST_MAPPING = "/receive";@PostMapping(value = POST_MAPPING)@ResponseBodypublic List areaList(@RequestBody String areaList){List<Area> list = new ArrayList<>();if(areaList == null ){return list;}/*** List<Area> listString = JSON.parseObject(areaList, new TypeReference<List<Area>>(){});* 注意这样写是错误的,Area包含属性GeoJsonPolygon,解析不了* 只好吧List的泛型写成String*/List<String> listString = JSON.parseObject(areaList, new TypeReference<List<String>>(){});JSONObject jsonObject = null;JSONObject polygonJsonObject = null;GeoJsonPolygon geoJsonPolygon = null;for (int i=0; i < listString.size(); i++){String s = listString.get(i);jsonObject = JSONObject.parseObject(s);//通过JSONObject对象获取key对应的valueString name = jsonObject.getString("name");//解析复杂的GeoJsonPolygon属性String geoJsonPolygonString = jsonObject.getString("geoJsonPolygon");polygonJsonObject = JSONObject.parseObject(geoJsonPolygonString);String pointsString = polygonJsonObject.getString("points");List<Point> points = JSON.parseObject(pointsString, new TypeReference<List<Point>>() {});geoJsonPolygon = new GeoJsonPolygon(points);Area area = new Area();area.setName(name);area.setGeoJsonPolygon(geoJsonPolygon);list.add(area);}return list;} }
注意:使用的是fastjson版本是1.2.47,如果是1.2.7版本在执行这条语句List<Point> points = JSON.parseObject(pointsString, new TypeReference<List<Point>>() {}) 会报错,因为1.2.7要求这里的泛型类Point必须有无参构造函数,而1.2.47版本没有无参构造函数也可以。
总结
a. 服务B首先使用了@RequestBody注解,然后解析该嵌套数据类型;
b. 如果是list利用List<String> listString = JSON.parseObject(areaList, new TypeReference<List<String>>(){}) 先解析成泛型为String的List。因为GeoJsonPolygon太复杂了,直接解析不了,如果是简单的如Point可以直接List<Point> points = JSON.parseObject(pointsString, new TypeReference<List<Point>>() {});
c. 如果不是list,并且该String对象还是嵌套JSON数据格式,就把String对象解析成JsonObject 对象;
d. 利用JsonObject 对象的getString方法获取对应属性key的字符串,如果该字符串还是复杂的JSON数据,进行b或c步骤,直到获取到想要的数据或解析完成。
在线JSON:http://www.bejson.com/
转载于:https://www.cnblogs.com/theRhyme/p/9580046.html
网络传输中利用fastjson将复杂嵌套数据类型Json格式转换(GeoJsonPolygon)相关推荐
- php输出json到表格,PHP中把数据库查询结果输出为json格式
header("Content-type:text/html;charset=utf-8");//字符编码设置 $servername = "localhost" ...
- Android网络传输中必用的两个加密算法:MD5 和 RSA (附java完成测试代码)
MD5和RSA是网络传输中最常用的两个算法,了解这两个算法原理后就能大致知道加密是怎么一回事了.但这两种算法使用环境有差异,刚好互补. 一.MD5算法 首先MD5是不可逆的,只能加密而不能解密.比如明 ...
- 网络传输中的两个阶段、阻塞IO、非阻塞IO和多路复用
今天学习了网络传输中的两个阶段.阻塞IO.非阻塞IO和多路复用 一.网络传输中的两个阶段 分别是 waitdata 和 copydata send就是copydata recv是waitdata和co ...
- 数据丢包怎么修复_一种网络传输中实时音频数据丢包恢复的方法与流程
本发明涉及通信技术领域,具体涉及一种网络传输中实时音频数据丢包恢复的方法. 背景技术: 随着通信技术的发展,音频传输系统对实时性和准确性的要求越来越高.在网络的音频传输过程中,影响音频音质的主要因素是 ...
- 网络传输中的数据长度
探究网络传输中不同层级的数据大小和数据格式 网络中不同层次的数据统称为PDU (协议数据单元 - protocol data unit) 每一层中可能有一种或多种协议,挑选最常见的协议进行说明 数据链 ...
- 网络传输中的那些编码之-base64编码
在前面一篇文章中,这里介绍了URL编码的一些知识点,本文将对网络中另外一个常见的编码方式base64编码进行介绍. 同样的,按照之前的介绍方式,本文将从如下几个方面进行介绍: 什么是base64编码 ...
- 网络传输中的那些编码之-URL编码
由于URL编码的一些混乱情况,曾经困扰着无数的程序员,本文将捋一捋URL编码相关的一些知识点,希望看望之后能给人恍然大悟的感觉. 本文将从如下几个方面进行介绍: 什么是URL编码 为什么进行URL编码 ...
- oracle中多层嵌套命名,一种多层嵌套的json格式数据的命名解析方法
一种多层嵌套的json格式数据的命名解析方法 [专利摘要]一种n层嵌套的json格式数据的命名解析方法,包括以下步骤:首先,以n层嵌套的json格式数据为基础建立数据源:然后,以键值对为最小单元由外而 ...
- OpenCV中利用cvConvertScale()将图像的数据类型由u8转化为64f...
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 OpenCV中利用cvConvertScale( ...
- Android网络传输中必用的两个加密算法:MD5 和 RSA 及Base64加密总结
(1)commons-codec包简介 包含一些通用的编码解码算法.包括一些语音编码器,Hex,Base64.MD5 一.md5.base64.commons-codec包 commons-codec ...
最新文章
- 西安python工资怎么样-在西安为什么对Python编程需求这么大?工资这么高?
- 计算机算法设计与分析 循环赛日程表
- jQuery UI:Datepicker将年份范围下拉至100年
- Vue学习笔记之06-响应式的数组方法
- Bran的内核开发指南_中文版
- 高校计算机成绩管理系统开题报告,高校科研管理系统_高校科研管理系统开题报告...
- 中国第一代***代表人物档案
- 我精心梳了犀利的发型,胡子刮得一干二净,去字节跳动面试,结果被怼了!...
- windows如何安装codeblock
- VMware虚拟机安装Win10
- selenium点击爬取豆瓣高分电影
- iOS crash分类,Mach异常、Unix 信号和NSException 异常
- git reset 怎么还原_git reset后如何恢复
- android 动态替换logo
- net-java-php-python-宠物销售系统计算机毕业设计程序
- 解决import org.junit.Test 和@Test报错
- Maven打包Resource资源文件损坏解决
- 《反脆弱:从不确定性中获益》
- 盛大游戏面试题目小结
- 以太网的信道利用率与MAC层详解