JSON字符串后台解析包含数组以百度地图API举例

时间:2023-01-12 13:54:09
前言

当你要获取某个json字符串的某个值时 前台通过JSONP很容易通过Key方式直接获取 但是Java后台就有点麻烦 下面介绍 如何解析json字符串

{
    "status": 0,
    "message": "ok",
    "result": [
        {
            "source": "baidu",
            "location": {
                "lat": 34.15401365959694,
                "lng": 118.85774971753034
            },
            "bound": "33.891080,118.511530;34.428571,119.182754",
            "formatted_address": "江苏省宿迁市沭阳县",
            "address_components": {
                "province": "江苏省",
                "city": "宿迁市",
                "district": "沭阳县",
                "street": "",
                "level": "区县"
            },
            "precise": 0.14
        }
    ]
}

如上json我要获取县的名字 这是一个比较复杂的json字符串 直接通过district是获取不到沭阳县的 解决思路

1.解析

1、 首先导入JSONObject依赖

        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>

2、开始编辑

import com.alibaba.fastjson.JSONArray;
import net.sf.json.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;

import java.io.IOException;

public class Testjson {

    public static void main(String[] args) throws JSONException, IOException {

        // 创建浏览器对象,浏览器对象就是HttpClient
        CloseableHttpClient httpClient = HttpClients.createDefault();
        // 创建请求
        //geotable_id : 可以省略
        //address
        //city
        //ak
        String url = "http://api.map.baidu.com/cloudgc/v1?address=内蒙古锡林郭勒正蓝旗&ak=yvGwgaaTTXBNuURy9Xxg2E5Wrsn0n2h3";
        HttpGet get = new HttpGet(url);
        //1 发请求 + 接收结果
        CloseableHttpResponse response = httpClient.execute(get);
        //2 解析结果
        int code = response.getStatusLine().getStatusCode();
        HttpEntity entity = response.getEntity();
        // 直接打印entity,打印的是内存地址,如果想打印内容,就需要调用EntityUtils.toString方法
        //3百度地图返回参数 参数形式见第一个代码
        String mapstr = EntityUtils.toString(entity);
        //开始解析 
        //4 将字符串转化为json对象
        JSONObject jsonObject =  JSONObject.fromObject(mapstr);
        //5 这是一个比较杂乱的json 先获取result数组
        String result = jsonObject.getString("result");
        //6 将字符串转为json数组
        JSONArray arr = JSONArray.parseArray(result);
        //7 数组长度为1 获取第一个元素 
        com.alibaba.fastjson.JSONObject obj = arr.getJSONObject(0);
        //8 数组内部包含很多json元素 获得address_components所对应的json集合
        String address = obj.getString("address_components");
        //9 将字符串解析成json对象
        JSONObject json2 =  JSONObject.fromObject(address);
        //10 获取 县 对应的地址
        String district = json2.getString("district");
        //输出
        System.out.println(district);
        //11 关闭
        response.close();
        httpClient.close();


    }
}

笔者:这是一个比较简单的代码 其实也就是一层一层的获取我们想要的内容 获取过程中 注意我们的数据应该是 字符串还是 对象本身 所以慢慢写 不要着急 多注意观察数据结构
注:另一种就是分装对象 写三个对象然后依次分装 也可以获得但是代码量比较多。

3.正则表达式

第三种方法字符串正则解析
封装通用工具类

package com.ycl.Utils;

import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class JSONUtil {
    /**
     * 返回json字符串中对应的值
     * json json格式字符串
     * s 要取的json键
     * e 要取的json键的下一个键
     */
    public static ArrayList<String> getParamByRex(String json, String start, String end) {

        ArrayList<String> list = new ArrayList<>();
        String regex=start + "\":(.*?),\"" + end; 
        Matcher matcher=Pattern.compile(regex).matcher(json);
        while(matcher.find())
        {
            String ret=matcher.group(1);
            list.add(ret);
        }
        return list;
    }

    public static void main(String[] args) {
        String json="[{\"id\":\"0\",\"name\":null,\"tankX\":200,\"tankK\":87,\"tankY\":200,\"blood\":100,\"attack\":10,\"killNum\":0},{\"id\":\"2\",\"name\":null,\"tankX\":320,\"tankK\":87,\"tankY\":320,\"blood\":100,\"attack\":10,\"killNum\":0}]";
        ArrayList<String> list = JSONUtil.getParamByRex(json, "tankX", "tankK");
        
        System.out.println(list.toString());
    }

}

祝你幸福
送你一首歌《lifter》 Galen Crew
附图:连云港 连岛海滨浴场
JSON字符串后台解析包含数组以百度地图API举例