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

xiaoxiao2021-07-05  221

前言

当你要获取某个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 附图:连云港 连岛海滨浴场

转载请注明原文地址: https://www.6miu.com/read-4821352.html

最新回复(0)