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;

}

}

}

相关文章
|
17天前
|
SQL 缓存 搜索推荐
后端技术在现代Web开发中的应用与挑战
本文将深入探讨后端技术在现代Web开发中的重要性,涵盖从基础架构到性能优化的多个方面。通过分析当前主流后端技术的优缺点,并提供一些实用的解决方案和建议,帮助开发者更好地应对日常开发中的挑战。
33 1
|
2月前
|
XML JSON 前端开发
【Web前端揭秘】XML与JSON:数据界的双雄对决,你的选择将如何改写Web世界的未来?
【8月更文挑战第26天】本文深入探讨了XML和JSON这两种广泛使用的数据交换格式在Web前端开发中的应用。XML采用自定义标签描述数据结构,适用于复杂层次数据的表示,而JSON则以键值对形式呈现数据,更为轻量且易解析。通过对两种格式的示例代码、结构特点及应用场景的分析,本文旨在帮助读者更好地理解它们的差异,并根据实际需求选择最合适的数据交换格式。
49 1
|
2月前
【Azure 应用服务】Web App Service 中的 应用程序配置(Application Setting) 怎么获取key vault中的值
【Azure 应用服务】Web App Service 中的 应用程序配置(Application Setting) 怎么获取key vault中的值
|
9天前
|
JSON 数据格式
Blob格式转json格式,拿到后端返回的json数据
文章介绍了如何将后端返回的Blob格式数据转换为JSON格式,并处理文件下载和错误提示。
21 0
Blob格式转json格式,拿到后端返回的json数据
|
23天前
|
安全 JavaScript Java
后端技术在现代Web开发中的实践与挑战
本文旨在探讨后端技术在现代Web开发中的关键作用,分析其在数据处理、业务逻辑实现和系统安全等方面的重要性。通过阐述常见的后端技术和框架,如Node.js、Django和Spring Boot,展示它们在实际项目中的应用。同时,文章将讨论后端开发所面临的主要挑战,包括性能优化、扩展性和维护性问题,以及如何应对这些挑战。最终,通过对实际案例的分析,总结出一套行之有效的后端开发最佳实践,为开发者提供参考。
48 5
|
23天前
|
人工智能 关系型数据库 数据安全/隐私保护
后端技术在现代Web开发中的应用与挑战
本文将深入探讨后端技术在现代Web开发中的重要性,通过分析其在数据处理、业务逻辑实现和安全性保障方面的应用,揭示后端技术的核心价值。同时,本文还将讨论当前后端开发面临的主要挑战,如高并发处理、数据安全、微服务架构的复杂性等,并给出相应的解决方案。无论是后端开发者还是对后端技术感兴趣的读者,都可以通过这篇文章获得启发和指导。
|
2月前
|
Java Spring 容器
彻底改变你的编程人生!揭秘 Spring 框架依赖注入的神奇魔力,让你的代码瞬间焕然一新!
【8月更文挑战第31天】本文介绍 Spring 框架中的依赖注入(DI),一种降低代码耦合度的设计模式。通过 Spring 的 DI 容器,开发者可专注业务逻辑而非依赖管理。文中详细解释了 DI 的基本概念及其实现方式,如构造器注入、字段注入与 setter 方法注入,并提供示例说明如何在实际项目中应用这些技术。通过 Spring 的 @Configuration 和 @Bean 注解,可轻松定义与管理应用中的组件及其依赖关系,实现更简洁、易维护的代码结构。
35 0
|
2月前
|
Rust 安全 开发者
惊爆!Xamarin 携手机器学习,开启智能应用新纪元,个性化体验与跨平台优势完美融合大揭秘!
【8月更文挑战第31天】随着互联网的发展,Web应用对性能和安全性要求不断提高。Rust凭借卓越的性能、内存安全及丰富生态,成为构建高性能Web服务器的理想选择。本文通过一个简单示例,展示如何使用Rust和Actix-web框架搭建基本Web服务器,从创建项目到运行服务器全程指导,帮助读者领略Rust在Web后端开发中的强大能力。通过实践,读者可以体验到Rust在性能和安全性方面的优势,以及其在Web开发领域的巨大潜力。
34 0
|
2月前
|
前端开发 开发者 Apache
揭秘Apache Wicket项目结构:如何打造Web应用的钢铁长城,告别混乱代码!
【8月更文挑战第31天】Apache Wicket凭借其组件化设计深受Java Web开发者青睐。本文详细解析了Wicket项目结构,帮助你构建可维护的大型Web应用。通过示例展示了如何使用Maven管理依赖,并组织页面、组件及业务逻辑,确保代码清晰易懂。Wicket提供的页面继承、组件重用等功能进一步增强了项目的可维护性和扩展性。掌握这些技巧,能够显著提升开发效率,构建更稳定的Web应用。
76 0
|
2月前
|
前端开发 程序员 API
从后端到前端的无缝切换:一名C#程序员如何借助Blazor技术实现全栈开发的梦想——深入解析Blazor框架下的Web应用构建之旅,附带实战代码示例与项目配置技巧揭露
【8月更文挑战第31天】本文通过详细步骤和代码示例,介绍了如何利用 Blazor 构建全栈 Web 应用。从创建新的 Blazor WebAssembly 项目开始,逐步演示了前后端分离的服务架构设计,包括 REST API 的设置及 Blazor 组件的数据展示。通过整合前后端逻辑,C# 开发者能够在统一环境中实现高效且一致的全栈开发。Blazor 的引入不仅简化了 Web 应用开发流程,还为习惯于后端开发的程序员提供了进入前端世界的桥梁。
56 0

热门文章

最新文章

下一篇
无影云桌面