web后端-json递归获取key值

简介: web后端-json递归获取key值

N.1 依赖

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>fastjson</artifactId>

<version>1.2.47</version>

</dependency>

<dependency>

<groupId>com.google.guava</groupId>

<artifactId>guava</artifactId>

<version>11.0.2</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>4.3.12.RELEASE</version>

</dependency>

这个代码只能获得第一个key的value,不能一下子取出所有的相同的key,所以这个获取数据只能一开始遍历json里面的大数据集合,然后里面的每一条小数据依次条用这些方法。

N.2 关系

N.3 demo

import com.alibaba.fastjson.JSON;

import com.alibaba.fastjson.JSONArray;

import com.alibaba.fastjson.JSONObject;

import com.alibaba.fastjson.TypeReference;

import com.google.common.base.Objects;

import java.io.*;

import java.util.Collection;

import java.util.LinkedHashMap;

import java.util.Map;

import java.util.List;

import org.apache.commons.lang3.StringUtils;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.springframework.util.ObjectUtils;

/**

*

* 常用JSON工具类 2020/2/26

*/

public class JSONUtil {

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

FileReader filedata = new FileReader("C:\\Users\\HMTX\\Desktop\\tmp\\乡村人员的个人信息.json");

BufferedReader BufferedData = new BufferedReader(filedata);

StringBuilder strdata = new StringBuilder();

String line;

while ((line = BufferedData.readLine()) != null) {

strdata.append(line + '\n');

}

BufferedData.close();

System.out.println(getJsonValueBykey(strdata.toString(), "msg")); // 如果json有相同的key,那这个代码只能获得第一个key。而且对于一般的格式 是可以获取的,如果是特别离谱的json 就可能查找不到。

}

private static final Log log = LogFactory.getLog(JSONUtil.class);

/**

* key的value值

*/

private static Object value;

/**

* 判断是否还有子级

*/

private static boolean flag = true;

/**

* 根据key获取value

*/

public static String getJsonValueBykey(String json, Object key) {

log.info("getJsonValueBykey json:" + json);

log.info("getJsonValueBykey key:" + key);

if (StringUtils.isNotBlank(json) && StringUtils.isNotBlank(key.toString())) {

log.info("getJsonValueBykey json and key is not null");

if (isJsonArray(json)) {

log.info("json is jsonArray");

JSONArray jsonDataArray = JSONArray.parseArray(json);

log.info("jsonDataArray size:" + jsonDataArray.size());

for (int i = 0; i < jsonDataArray.size(); i++) {

if (isJsonObject(jsonDataArray.get(i).toString())) {

log.info("job json:" + jsonDataArray.get(i));

JSONObject job = jsonDataArray.getJSONObject(i);

value = parseJsonString(job.toJSONString(), key).toString();

}

}

} else if (isJsonObject(json)) {

log.warn("json is jsonObject");

value = parseJsonString(json, key).toString();

}

return value.toString();

} else {

log.error("json and key is null");

return null;

}

}

/**

* @描述 从map按动态的key解析值 ,直到解析出想要的值

*/

public static Object parseJsonMap(Map.Entry<String, Object> entry, String key) {

log.info("value:" + value);

if (ObjectUtils.isEmpty(value)) {

log.info("value is null");

if (flag) {

log.info("entry key:" + entry.getKey());

log.info("key:" + key);

if (Objects.equal(entry.getKey(), key)) {

value = entry.getValue();

flag = false;

} else {

log.info("entry value:" + entry.getValue());

//如果是单个map继续遍历

if (entry.getValue() instanceof Map) {

log.info("value is map");

if (isJsonMap(entry.getValue().toString())) {

LinkedHashMap<String, Object> jsonMap = JSON.parseObject(entry.getValue().toString(), new TypeReference<LinkedHashMap<String, Object>>() {

});

for (Map.Entry<String, Object> entry2 : jsonMap.entrySet()) {

if (!StringUtils.contains(entry2.getKey(), key)) {

log.info("entry2 entry2.getKey() is not key ");

value = parseJsonMap(entry2, key);

} else {

log.warn(" entry2 entry2.getKey() is key ");

value = entry2.getValue();

log.info("value:" + value);

flag = false;

break;

}

}

}

}

//如果是String就获取它的值

if (entry.getValue() instanceof String) {

log.info("entry.getValue() is String:");

log.info("key:" + entry.getKey() + "value:" + entry.getValue());

// parseJsonString(entry.getValue().toString(), key);

}

//如果是空JSONArray,就返回它的值

if (entry.getValue() instanceof JSONArray && ((JSONArray) entry.getValue()).isEmpty()) {

log.info("key" + entry.getKey() + ", value: []");

value = "[]";

log.info("value:" + value);

flag = false;

}

//如果是list就提取出来

if (entry.getValue() instanceof List && ((Collection) entry.getValue()).size() > 0) {

List list = (List) entry.getValue();

for (int i = 0; i < list.size(); i++) {

parseJsonString(list.get(i).toString(), key);

}

}

}

}

}

log.info("value:" + value);

return value;

}

/**

* @描述 从JSON对象中,根据指定key获取值,只拿第一个

*/

public static Object parseJsonString(String json, Object key) {

log.info("parseJsonString json:" + json);

log.info("parseJsonString key:" + key);

if (!ObjectUtils.isEmpty(json) && !ObjectUtils.isEmpty(key)) {

log.info(" parseJsonString json and key is not null");

if (isJsonMap(json)) {

LinkedHashMap<String, Object> jsonMap = JSON.parseObject(json, new TypeReference<LinkedHashMap<String, Object>>() {

});

for (Map.Entry<String, Object> entry : jsonMap.entrySet()) {

log.info("entry key:" + entry.getKey());

log.info("key:" + key);

if (!StringUtils.contains(entry.getKey(), key.toString())) {

log.info("is not blank ");

value = parseJsonMap(entry, key.toString());

} else {

log.warn(" is blank ");

value = entry.getValue();

break;

}

}

}

return value;

} else {

log.info("json and key is null");

return null;

}

}

/**

* 判断字符串是否可以转化为json对象

*/

public static boolean isJsonObject(String content) {

// 此处应该注意,不要使用StringUtils.isEmpty(),因为当content为" "空格字符串时,JSONObject.parseObject可以解析成功,

// 实际上,这是没有什么意义的。所以content应该是非空白字符串且不为空,判断是否是JSON数组也是相同的情况。

if (StringUtils.isBlank(content)) {

return false;

}

try {

JSONObject jsonStr = JSONObject.parseObject(content);

return true;

} catch (Exception e) {

return false;

}

}

/**

* 判断字符串是否可以转化为JSON数组

*/

public static boolean isJsonArray(String content) {

if (StringUtils.isBlank(content)) {

return false;

}

StringUtils.isEmpty(content);

try {

JSONArray jsonStr = JSONArray.parseArray(content);

return true;

} catch (Exception e) {

return false;

}

}

/**

* 判断是否可以按照map动态的key解析值

*/

public static boolean isJsonMap(String content) {

log.info("content:" + content);

if (StringUtils.isBlank(content)) {

return false;

}

StringUtils.isEmpty(content);

try {

LinkedHashMap<String, Object> jsonMap = JSON.parseObject(content, new TypeReference<LinkedHashMap<String, Object>>() {

});

return true;

} catch (Exception e) {

return false;

}

}

}

相关文章
|
19天前
|
前端开发 JavaScript 关系型数据库
从前端到后端:构建现代化Web应用的技术探索
在当今互联网时代,Web应用的开发已成为了各行各业不可或缺的一部分。从前端到后端,这篇文章将带你深入探索如何构建现代化的Web应用。我们将介绍多种技术,包括前端开发、后端开发以及各种编程语言(如Java、Python、C、PHP、Go)和数据库,帮助你了解如何利用这些技术构建出高效、安全和可扩展的Web应用。
|
1月前
|
JSON JavaScript 数据格式
jwt-auth插件实现了基于JWT(JSON Web Tokens)进行认证鉴权的功能。
jwt-auth插件实现了基于JWT(JSON Web Tokens)进行认证鉴权的功能。
44 1
|
1月前
|
缓存 关系型数据库 API
后端开发:构建高效、可扩展的Web应用程序的关键
后端开发:构建高效、可扩展的Web应用程序的关键
22 0
|
3天前
|
前端开发 JavaScript Java
前端与后端:构建现代Web应用的双翼
前端与后端:构建现代Web应用的双翼
|
12天前
|
缓存 负载均衡 数据库
优化后端性能:提升Web应用响应速度的关键策略
在当今数字化时代,Web应用的性能对于用户体验至关重要。本文探讨了如何通过优化后端架构和技术手段,提升Web应用的响应速度。从数据库优化、缓存机制到异步处理等多个方面进行了深入分析,并提出了一系列实用的优化策略,以帮助开发者更好地应对日益增长的用户访问量和复杂的业务需求。
16 1
|
25天前
|
XML JSON JavaScript
使用JSON和XML:数据交换格式在Java Web开发中的应用
【4月更文挑战第3天】本文比较了JSON和XML在Java Web开发中的应用。JSON是一种轻量级、易读的数据交换格式,适合快速解析和节省空间,常用于API和Web服务。XML则提供更强的灵活性和数据描述能力,适合复杂数据结构。Java有Jackson和Gson等库处理JSON,JAXB和DOM/SAX处理XML。选择格式需根据应用场景和需求。
|
1月前
web后端-IIS-web发布
web后端-IIS-web发布
|
1月前
|
应用服务中间件 Apache nginx
web后端-web服务器对比
web后端-web服务器对比
|
1月前
|
应用服务中间件
web后端-EasyWeb-web发布
web后端-EasyWeb-web发布
|
1月前
|
监控
web后端-最好用的扒站仿站工具(网页克隆网页复制)
web后端-最好用的扒站仿站工具(网页克隆网页复制)