如何解析json字符串及返回json数据到前端

摘要:
想要更好的解析JSON,必须能看懂JSON数据,这样就必须了解JSON语法,好在它的语法非常简单,规则如下:JSON语法是JavaScript对象表示法语法的子集。可以将一个JSON字符串转成一个Java对象,或者反过来。

前言:最近需要实现的任务是:写若干个接口,并且接口中的请求数据是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的值可以为以下几种:

-数字(整数或浮点数)
-字符串(在双引号中)
- 逻辑值(truefalse-数组(在方括号中)
-对象(在花括号中)
- 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 classHerdCamera {
    privateString zone_id;
    privateString title;
    privateZoneGeometry zoneGeometry;
    publicString getZone_id() {
        returnzone_id;
    }
    public voidsetZone_id(String zone_id) {
        this.zone_id =zone_id;
    }
    publicString getTitle() {
        returntitle;
    }
    public voidsetTitle(String title) {
        this.title =title;
    }
    publicZoneGeometry getZoneGeometry() {
        returnzoneGeometry;
    }
    public voidsetZoneGeometry(ZoneGeometry zoneGeometry) {
        this.zoneGeometry =zoneGeometry;
    }
}
importjava.util.List;
public classZoneGeometry {
    privateString type;
    private List<Locations>apex;
    publicString getType() {
        returntype;
    }
    public voidsetType(String type) {
        this.type =type;
    }
    public List<Locations>getApex() {
        returnapex;
    }
    public void setApex(List<Locations>apex) {
        this.apex =apex;
    }
}
public classApex {
    private doublelng;
    private doublelat;
    public Apex(double lng, doublelat) {
        super();
        this.lng =lng;
        this.lat =lat;
    }
    public doublegetLng() {
        returnlng;
    }
    public void setLng(doublelng) {
        this.lng =lng;
    }
    public doublegetLat() {
        returnlat;
    }
    public void setLat(doublelat) {
        this.lat =lat;
    }
}

3、开始依次从外往内部解析数据源

public Map<String,Object> herdcameradata() throwsException{
        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 = newHerdCamera();
            herd.setZone_id(subObject.get("zone_id").getAsString());       //然后依次获取subObject中的每一个字段
            herd.setTitle(subObject.get("title").getAsString());
            ZoneGeometry zoneGeometry = newZoneGeometry();
            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 = newLocations();
                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 );
        returnresult;
    }

4、结束

到现在,所有的解析都已经基本完成,但配合着controller中的映射就可以在前端获取到相关的数据。

下面给出我获取到的情况:

如何解析json字符串及返回json数据到前端第1张

免责声明:文章转载自《如何解析json字符串及返回json数据到前端》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇webpack4 css添加浏览器前缀 postcss-loader在iOS开发过程中你遇到这个问题了么?下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

微信小程序访问webservice(wsdl)+ axis2发布服务端(Java)

0、主要思路:使用axis2发布webservice服务端,微信小程序作为客户端访问。步骤如下: 1、服务端: 首先微信小程序仅支持访问https的url,且必须是已备案域名。因此前期的服务器端工作需要先做好,本人是申请了个人域名(已备案),并使用阿里云服务器,然后申请免费SSL,通过配置tomcat完成支持https访问。此外,intellJ IDE的j...

在Android里完美实现基站和WIFI定位

来自:http://www.cnblogs.com/coffeegg/archive/2011/10/01/2197129.html 众所周知的,在OPhone和大部分国产的Android定制机里不支持最简单实用的基站和WIFI定位,只能使用速度慢而耗电的GPS定位,但OPhone和华为/中兴生产的一些Android定制机却占据了一定的市场,因此导致了...

Java几种常用JSON库性能比较

本篇通过JMH来测试一下Java中几种常见的JSON解析库的性能。 每次都在网上看到别人说什么某某库性能是如何如何的好,碾压其他的库。但是百闻不如一见,只有自己亲手测试过的才是最值得相信的。 JSON不管是在Web开发还是服务器开发中是相当常见的数据传输格式,一般情况我们对于JSON解析构造的性能并不需要过于关心,除非是在性能要求比较高的系统。 目前对于J...

fastJSON 使用总结

1.介绍Fastjson Fastjson是一个Java语言编写的JSON处理器。 如果获得Fastjson?https://github.com/alibaba/fastjson 2.使用Fastjson Json互转List<T> 比如说List<Strudent> List转Json List<Student>...

ClassLoader读取classpath目录下的文件

项目中的需求是根据配置文件创建一个页面,配置文件中配置一些图例或者搜索框。读取classpath目录下文件的方式有很多,且记录自己在项目中用到的一种方式。 ClassLoader主要是对类的请求提供服务,当jvm需要某个类时,它根据名称向ClassLoader请求获得这个类,然后ClassLoader返回给jvm这个类的class对象。ClassLoad...

easyui datagrid 可过滤行的数据表格 导出

    //过滤栏表格导出数据                  /* xukf                 * id datagrid id                 * url Action 路径                 */                function exportExcelToFilter(id){      ...