如何解析json字符串及返回json数据到前端
2018-06-21 06:52:41来源:未知 阅读 ()
前言:最近需要实现的任务是:写若干个接口,并且接口中的请求数据是json格式,然后按照请求参数读取前端提前整理好的json数据,并且将json数据返回到服务器端。
- 主要的工具:Gson 2.8.2
- 项目支撑:springboot
- maven
0、前导——了解一下基本的json语法
JSON是一种类似 XML的语言,是用了存储和交换文本信息的语法。它的全称为JavaScript Object Notation(JavaScript 对象表示法)。与xml对比,它更小、更快,更易解析。
想要更好的解析JSON,必须能看懂JSON数据,这样就必须了解JSON语法,好在它的语法非常简单,规则如下:
JSON 语法是 JavaScript 对象表示法语法的子集。 - 数据在名称/值对中:如 "firstName" : "John" - 数据由逗号分隔 - 花括号保存对象 - 方括号保存数组
而组成JSON的值可以为以下几种:
- 数字(整数或浮点数) - 字符串(在双引号中) - 逻辑值(true 或 false) - 数组(在方括号中) - 对象(在花括号中) - null
1、导入Gson jar包
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.2</version> </dependency>
关于Gson的详细信息可以参考:JAVA解析JSON数据
Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。
这是关于GSON的介绍,相对于传统的json解析,使用GSON能够极大的简化了解析流程。
2、下面提供一小段提前整理好的json数据
[ { "zone_id": 100001, "title": "围栏1", "zone_geometry": { "type": "polygon", "apex": [ { "lng": "113.166096", "lat": "31.727309" }, { "lng": "113.222498", "lat": "31.689881" } ] } }, { "zone_id": 100002, "title": "围栏2", "zone_geometry": { "type": "polygon", "apex": [ { "lng": "113.462342", "lat": "31.626034" }, { "lng": "113.472525", "lat": "31.538983" } ] } }, ]
分析原始的json数据格式:原始的json数据整体是一个JsonArray,其次是JsonObject,内部包含有很多字段,里面再套有一层JsonObject,再往里面是JsonArray。
通常而言,遇到了一个[ ] 可以定义一个List,碰见一个{ } 可以定义一个实体类。
因此,我这里定义了三个实体类:
从外层往内层依次是:HerdCamera ZoneGeometry Apex
public class HerdCamera { private String zone_id; private String title; private ZoneGeometry zoneGeometry; public String getZone_id() { return zone_id; } public void setZone_id(String zone_id) { this.zone_id = zone_id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public ZoneGeometry getZoneGeometry() { return zoneGeometry; } public void setZoneGeometry(ZoneGeometry zoneGeometry) { this.zoneGeometry = zoneGeometry; } }
import java.util.List; public class ZoneGeometry { private String type; private List<Locations> apex; public String getType() { return type; } public void setType(String type) { this.type = type; } public List<Locations> getApex() { return apex; } public void setApex(List<Locations> apex) { this.apex = apex; } }
public class Apex { private double lng; private double lat; public Apex(double lng, double lat) { super(); this.lng = lng; this.lat = lat; } public double getLng() { return lng; } public void setLng(double lng) { this.lng = lng; } public double getLat() { return lat; } public void setLat(double lat) { this.lat = lat; } }
3、开始依次从外往内部解析数据源
public Map<String,Object> herdcameradata() throws Exception{ String fileName = "fileName"; JsonParser parser = new JsonParser(); // 创建JSON解析器 JsonArray array = (JsonArray) parser.parse(new FileReader(fileName)); // 首先解析出来的是JsonArray Map< String, Object> result=new HashMap<>(); List<Object> herdCameras = new ArrayList<Object>(); for (int i = 0; i < array.size(); i++) { JsonObject subObject = array.get(i).getAsJsonObject(); // 第二步获得的是JsonObject HerdCamera herd = new HerdCamera(); herd.setZone_id(subObject.get("zone_id").getAsString()); //然后依次获取subObject中的每一个字段 herd.setTitle(subObject.get("title").getAsString()); ZoneGeometry zoneGeometry = new ZoneGeometry(); JsonObject subObject2 = subObject.getAsJsonObject("zone_geometry"); //第四步又获得一个zone_geometry的JsonObject zoneGeometry.setType(subObject2.get("type").getAsString()); //然后获取zone_geometry内部的type对象 JsonArray array2 = subObject2.getAsJsonArray("apex"); //第五步中apex是一个jsonArray List<Locations> locationList = new ArrayList<Locations>(); for (int j = 0; j < array2.size(); j++) { Locations location = new Locations(); JsonObject subObject3 = array2.get(j).getAsJsonObject(); location.setLng(subObject3.get("lng").getAsString()); location.setLat(subObject3.get("lat").getAsString()); locationList.add(location); } zoneGeometry.setApex(locationList); herd.setZoneGeometry(zoneGeometry); herdCameras.add(herd); } result.put("cameras",herdCameras ); return result; }
4、结束
到现在,所有的解析都已经基本完成,但配合着controller中的映射就可以在前端获取到相关的数据。
下面给出我获取到的情况:
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:java双重检查锁定
下一篇:关于MyBatis
- Flink 如何分流数据 2020-06-11
- 老板让你抗住千万级流量,如何做架构设计? 2020-06-11
- JVM常见面试题解析 2020-06-11
- 如何干掉 if else 策略+工厂 2020-06-11
- 类的继承,方法重新中修饰符如何定义 2020-06-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash