web后端-json递归获取key值

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 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;

}

}

}

相关文章
|
2月前
|
存储 安全 关系型数据库
后端技术:构建高效稳定的现代Web应用
【10月更文挑战第5天】后端技术:构建高效稳定的现代Web应用
67 1
|
3月前
|
SQL 缓存 搜索推荐
后端技术在现代Web开发中的应用与挑战
本文将深入探讨后端技术在现代Web开发中的重要性,涵盖从基础架构到性能优化的多个方面。通过分析当前主流后端技术的优缺点,并提供一些实用的解决方案和建议,帮助开发者更好地应对日常开发中的挑战。
57 1
|
4月前
|
XML JSON 前端开发
【Web前端揭秘】XML与JSON:数据界的双雄对决,你的选择将如何改写Web世界的未来?
【8月更文挑战第26天】本文深入探讨了XML和JSON这两种广泛使用的数据交换格式在Web前端开发中的应用。XML采用自定义标签描述数据结构,适用于复杂层次数据的表示,而JSON则以键值对形式呈现数据,更为轻量且易解析。通过对两种格式的示例代码、结构特点及应用场景的分析,本文旨在帮助读者更好地理解它们的差异,并根据实际需求选择最合适的数据交换格式。
63 1
|
4月前
【Azure 应用服务】Web App Service 中的 应用程序配置(Application Setting) 怎么获取key vault中的值
【Azure 应用服务】Web App Service 中的 应用程序配置(Application Setting) 怎么获取key vault中的值
|
19天前
|
存储 JSON 安全
如何使用 JSON Web Tokens 进行身份验证?
总的来说,JWT 是一种强大而灵活的身份验证方式,通过正确使用和管理,可以为应用提供可靠的身份验证机制,同时提高系统的可扩展性和安全性。在实际应用中,需要根据具体的需求和场景,合理设计和实施 JWT 身份验证方案。
38 8
|
2月前
|
存储 安全 数据库
后端技术在现代Web开发中的实践与创新
【10月更文挑战第13天】 本文将深入探讨后端技术在现代Web开发中的重要性,通过实际案例分析展示如何利用先进的后端技术提升用户体验和系统性能。我们将从基础架构设计、数据库优化、安全性保障等方面展开讨论,为读者提供清晰的指导和实用的技巧。无论是新手开发者还是经验丰富的技术人员,都能从中获得启发和帮助。
42 2
|
2月前
|
自然语言处理 Cloud Native 数据安全/隐私保护
后端技术在现代Web开发中的实践与创新
本文探讨了后端技术在现代Web开发中的重要性及其应用。通过分析当前流行的后端框架和开发模式,揭示了如何利用这些技术来构建高效、可扩展的Web应用程序。同时,文章也讨论了未来后端技术的发展趋势,为开发者提供了一些启示。
|
2月前
|
存储 JSON 前端开发
JSON与现代Web开发:数据交互的最佳选择
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也便于机器解析和生成。它以文本格式存储数据,常用于Web应用中的数据传输,尤其是在客户端和服务器之间。
68 0
|
3月前
|
JSON 数据格式
Blob格式转json格式,拿到后端返回的json数据
文章介绍了如何将后端返回的Blob格式数据转换为JSON格式,并处理文件下载和错误提示。
122 0
Blob格式转json格式,拿到后端返回的json数据
|
3月前
|
安全 JavaScript Java
后端技术在现代Web开发中的实践与挑战
本文旨在探讨后端技术在现代Web开发中的关键作用,分析其在数据处理、业务逻辑实现和系统安全等方面的重要性。通过阐述常见的后端技术和框架,如Node.js、Django和Spring Boot,展示它们在实际项目中的应用。同时,文章将讨论后端开发所面临的主要挑战,包括性能优化、扩展性和维护性问题,以及如何应对这些挑战。最终,通过对实际案例的分析,总结出一套行之有效的后端开发最佳实践,为开发者提供参考。
75 5