如果一个对象太复杂了,那么在网络传输键的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)相关推荐

  1. php输出json到表格,PHP中把数据库查询结果输出为json格式

    header("Content-type:text/html;charset=utf-8");//字符编码设置 $servername = "localhost" ...

  2. Android网络传输中必用的两个加密算法:MD5 和 RSA (附java完成测试代码)

    MD5和RSA是网络传输中最常用的两个算法,了解这两个算法原理后就能大致知道加密是怎么一回事了.但这两种算法使用环境有差异,刚好互补. 一.MD5算法 首先MD5是不可逆的,只能加密而不能解密.比如明 ...

  3. 网络传输中的两个阶段、阻塞IO、非阻塞IO和多路复用

    今天学习了网络传输中的两个阶段.阻塞IO.非阻塞IO和多路复用 一.网络传输中的两个阶段 分别是 waitdata 和 copydata send就是copydata recv是waitdata和co ...

  4. 数据丢包怎么修复_一种网络传输中实时音频数据丢包恢复的方法与流程

    本发明涉及通信技术领域,具体涉及一种网络传输中实时音频数据丢包恢复的方法. 背景技术: 随着通信技术的发展,音频传输系统对实时性和准确性的要求越来越高.在网络的音频传输过程中,影响音频音质的主要因素是 ...

  5. 网络传输中的数据长度

    探究网络传输中不同层级的数据大小和数据格式 网络中不同层次的数据统称为PDU (协议数据单元 - protocol data unit) 每一层中可能有一种或多种协议,挑选最常见的协议进行说明 数据链 ...

  6. 网络传输中的那些编码之-base64编码

    在前面一篇文章中,这里介绍了URL编码的一些知识点,本文将对网络中另外一个常见的编码方式base64编码进行介绍. 同样的,按照之前的介绍方式,本文将从如下几个方面进行介绍: 什么是base64编码 ...

  7. 网络传输中的那些编码之-URL编码

    由于URL编码的一些混乱情况,曾经困扰着无数的程序员,本文将捋一捋URL编码相关的一些知识点,希望看望之后能给人恍然大悟的感觉. 本文将从如下几个方面进行介绍: 什么是URL编码 为什么进行URL编码 ...

  8. oracle中多层嵌套命名,一种多层嵌套的json格式数据的命名解析方法

    一种多层嵌套的json格式数据的命名解析方法 [专利摘要]一种n层嵌套的json格式数据的命名解析方法,包括以下步骤:首先,以n层嵌套的json格式数据为基础建立数据源:然后,以键值对为最小单元由外而 ...

  9. OpenCV中利用cvConvertScale()将图像的数据类型由u8转化为64f...

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 OpenCV中利用cvConvertScale( ...

  10. Android网络传输中必用的两个加密算法:MD5 和 RSA 及Base64加密总结

    (1)commons-codec包简介 包含一些通用的编码解码算法.包括一些语音编码器,Hex,Base64.MD5 一.md5.base64.commons-codec包 commons-codec ...

最新文章

  1. 西安python工资怎么样-在西安为什么对Python编程需求这么大?工资这么高?
  2. 计算机算法设计与分析 循环赛日程表
  3. jQuery UI:Datepicker将年份范围下拉至100年
  4. Vue学习笔记之06-响应式的数组方法
  5. Bran的内核开发指南_中文版
  6. 高校计算机成绩管理系统开题报告,高校科研管理系统_高校科研管理系统开题报告...
  7. 中国第一代***代表人物档案
  8. 我精心梳了犀利的发型,胡子刮得一干二净,去字节跳动面试,结果被怼了!...
  9. windows如何安装codeblock
  10. VMware虚拟机安装Win10
  11. selenium点击爬取豆瓣高分电影
  12. iOS crash分类,Mach异常、Unix 信号和NSException 异常
  13. git reset 怎么还原_git reset后如何恢复
  14. android 动态替换logo
  15. net-java-php-python-宠物销售系统计算机毕业设计程序
  16. 解决import org.junit.Test 和@Test报错
  17. Maven打包Resource资源文件损坏解决
  18. 《反脆弱:从不确定性中获益》
  19. 盛大游戏面试题目小结
  20. 以太网的信道利用率与MAC层详解

热门文章

  1. 「leetcode」1207. 独一无二的出现次数:【数组在哈希法中的经典应用】详解
  2. Photoshop 2020 for Mac(PS 2020)中英双版
  3. iOS开发之国际化(二)
  4. Enfocus PitStop Pro 2021 for Mac(pdf增强插件)
  5. USB-C 端口在您的 Mac 上无法使用如何解决?
  6. 苹果Mac 软件出现「意外退出」及「打不开」解决方法
  7. VMware mac虚拟机如何安装Windows系统
  8. Hillstone设备管理-许可证安装
  9. 比char还小的变量
  10. action属性注入为null