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