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;

}

}

}

相关文章
|
1月前
|
JSON 前端开发 JavaScript
前端使用lottie-web,使用AE导出的JSON动画贴心教程
前端使用lottie-web,使用AE导出的JSON动画贴心教程
|
28天前
|
前端开发 JavaScript Java
web 技术中前端和后端交互过程
客户端:上网过程中,负责浏览资源的电脑,叫客户端
32 0
|
29天前
|
JSON 算法 数据安全/隐私保护
聊聊 JSON Web Token (JWT) 和 jwcrypto 的使用
本文介绍了 JSON Web Token (JWT) 和 Python 中的 `jwcrypto` 库。JWT 是一种用于安全传输信息的紧凑型令牌,常用于身份验证。它由 Header、Payload 和 Signature 三部分组成,具有紧凑性、自包含和安全性等特点。`jwcrypto` 库提供了 JWT 的生成、验证、加密、解密及签名功能。通过该库,可以使用 RSA 等算法创建和验证 JWT,同时管理密钥对。安装 `jwcrypto` 可用 `pip install jwcrypto`,并示例展示了如何生成签名 JWT 和密钥对。
聊聊 JSON Web Token (JWT) 和 jwcrypto 的使用
|
29天前
|
存储 人工智能 前端开发
从前端到后端,探索Web开发的奥秘
Web开发是当今最热门的技术领域之一,涉及前端、后端、数据库等多个方面。本文将介绍Web开发的基本架构和技术要点,并深入探讨前后端交互、安全性等问题,帮助读者更好地理解Web开发的奥秘。
|
29天前
|
前端开发 Java Go
从前端到后端:构建现代化Web应用的技术演进
本文探讨了从前端到后端的技术演进,介绍了前端、后端以及多种编程语言,如Java、Python、C、PHP和Go,以及数据库在构建现代化Web应用中的应用。通过深入剖析各个技术领域的发展和应用,读者将对构建高效、可扩展、安全的Web应用有更深入的理解。
|
1月前
|
缓存 监控 API
利用Python构建高性能的Web API后端服务
随着微服务架构的普及和RESTful API的广泛应用,构建高性能、可扩展的Web API后端服务变得尤为重要。本文将探讨如何利用Python这一强大且灵活的语言,结合现代Web框架和工具,构建高效、可靠的Web API后端服务。我们将分析Python在Web开发中的优势,介绍常用的Web框架,并通过实际案例展示如何设计并实现高性能的API服务。
|
1月前
|
前端开发 Java Go
从前端到后端:构建现代化Web应用的技术实践
本文将介绍如何通过前端和后端技术相结合,构建现代化Web应用的技术实践。我们将探讨前端开发、后端架构以及多种编程语言(如Java、Python、C、PHP、Go)在构建高效、可扩展的Web应用中的应用。
|
1月前
|
JSON JavaScript 前端开发
vue的 blob文件下载文件时,后端自定义异常,并返回json错误提示信息,前端捕获信息并展示给用户
vue的 blob文件下载文件时,后端自定义异常,并返回json错误提示信息,前端捕获信息并展示给用户
|
1月前
|
JSON JavaScript Java
从前端Vue到后端Spring Boot:接收JSON数据的正确姿势
从前端Vue到后端Spring Boot:接收JSON数据的正确姿势
66 0
|
1月前
|
XML JSON 前端开发
【Web 前端】XML和JSON的区别?
【4月更文挑战第22天】【Web 前端】XML和JSON的区别?
【Web 前端】XML和JSON的区别?