用递归方式在JSON中查找对象
Json文件例子:
{
"type": "Update",
"data": {
"temp": "v",
"Name": "tttt",
"Id": 5,
"template": {
"head": {
"headtext": " "
},
"body": {
"bodytext": {
"1": "123456789"
},
"image": {
"2": 169000
}
},
"tag": {
"1": {
"image": {
"normal": 179000
},
"back": {
"normal": 180000
},
"state": true
}
}
}
}
}
代码:
package com.test.java; import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator; import org.json.JSONException;
import org.json.JSONObject; public class FindKeyInJson { static String stringInJSON = null; public static void main(String[] args) { File jsonFile = new File(
"D:\\jsonexample.txt");
StringBuffer sb = new StringBuffer();
try (BufferedReader br = new BufferedReader(new FileReader(jsonFile))) {
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} try {
System.out.println(sb.toString());
JSONObject jo = new JSONObject(sb.toString());
String content = getKeyString(jo, "bodytext");//获取bodytext字段信息
System.out.println(content);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } public static String getKeyString(JSONObject json, String key) {
HashSet<String> hSet = new HashSet<String>(); if (json.has(key)) {
// 在当前的层次中存在指定的key,可以直接获取指定key对应的string
try {
stringInJSON = json.get(key).toString();
} catch (JSONException e) {
e.printStackTrace();
}
} else {
// 在当前的层次中不存在指定的key,需要往下一个层次查找
hSet = getKeySetOnJSON(json);// 获取当前层次的所有key
Iterator<String> iterator = hSet.iterator();
while (iterator.hasNext()) {
String i = iterator.next();
if (isJSONObject(json, i)) {
try {
JSONObject tp = (JSONObject) json.get(i);
HashSet<String> hSet2 = new HashSet<String>();
hSet2 = getKeySetOnJSON(tp);
if (tp.has(key)) {
stringInJSON = tp.get(key).toString();
break;
} else {
getKeyString(tp, key);// 开始递归
} } catch (JSONException e) { e.printStackTrace();
}
}
}
}
return stringInJSON;
} public static HashSet<String> getKeySetOnJSON(JSONObject json) {
HashSet<String> hSet = new HashSet<String>();
Iterator<String> iterator = json.keys();
while (iterator.hasNext()) {
String i = iterator.next();
hSet.add(i);
}
return hSet;
} public static boolean isJSONObject(JSONObject json, String key) {
boolean flag = false;
try {
try {
JSONObject tp = (JSONObject) json.get(key);
System.out.println(key + " is JSON Object");
flag = true;
} catch (JSONException e) {
e.printStackTrace();
}
} catch (ClassCastException e) {
System.out.println(key + " is not JSON Object");
}
return flag;
} }
result:
{ "type": "Update", "data": { "temp": "v", "Name": "tttt", "Id": 5, "template": { "head": { "headtext": " " }, "body": { "bodytext": { "1": "123456789" }, "image": { "2": 169000 } }, "tag": { "1": { "image": { "normal": 179000 }, "back": { "normal": 180000 }, "state": true } } } }}
data is JSON Object
template is JSON Object
head is JSON Object
headtext is not JSON Object
tag is JSON Object
1 is JSON Object
image is JSON Object
normal is not JSON Object
back is JSON Object
normal is not JSON Object
state is not JSON Object
body is JSON Object
temp is not JSON Object
Id is not JSON Object
Name is not JSON Object
type is not JSON Object
{"1":"123456789"} //最终结果
用递归方式在JSON中查找对象的更多相关文章
- Java如何从数组中查找对象元素?
在Java中,如何从数组中查找对象元素? 示例 以下示例使用Contains方法来搜索数组中的String对象. package com.yiibai; import java.util.*; pub ...
- spring mvc各种常见类型参数绑定方式以及json字符串绑定对象
在使用spring mvc作为框架的时候,为了规范,我们通常希望客户端的请求参数符合规范直接通过DTO的方式从客户端提交到服务端,以便保持规范的一致性,除了很简单的情况使用RequestParam映射 ...
- EasyUI Tree递归方式获取JSON
最近需要用到EASYUI中的TREE功能,以前我是直接拼接成<UL><LI>发现这样拼完之后在更改树后对树的刷新不是很理想,现改用JSON格式,首先分析TREE中JOSN格式如 ...
- json中$ref对象重复引用问题
FastJson提供了SerializerFeature.DisableCircularReferenceDetect这个序列化选项,用来关闭引用检测.关闭引用检测后,重复引用对象时就不会被$ref代 ...
- es6中的find filter 在数组中查找对象
数组的方法find和filter var aa=[{id:1,name:'张三'},{id:2,name:'李四'},{id:3,name:'王五'},{id:2,name:'赵六'}] aa.fin ...
- kbmmw 中JSON 中使用SQL 查询
前面讲到了kbmmw 的JSON 对象操作,如何快速的查找JSON 中的值? 一种办法就是通过遍历的方法,其实在kbmmw 还有一种灵活的查询方式, 就是通过SQL 方式查询JSON 中的值.也就是说 ...
- WPF教程九:理解WPF中的对象资源
在WPF中,所有继承自FrameworkElement的元素都包含一个Resources属性,这个属性就是我们这篇要讲的资源. 这一篇讲解的资源是不是上一篇的程序集资源(那个是在编译过程中打包到程序集 ...
- EF封装类 增加版,增加从缓存中查找数据方法,供参考!
EF封装类 增加版,增加从缓存中查找数据方法,供参考! 这个类是抽象类,我这里增加了需要子类验证的方法ValidateEntity,方便扩展,若想直接使用该类,可以将该类更改成静态类,里面所有的方法都 ...
- SQL Server中CTE的另一种递归方式-从底层向上递归
SQL Server中的公共表表达式(Common Table Expression,CTE)提供了一种便利的方式使得我们进行递归查询.所谓递归查询方便对某个表进行不断的递归从而更加容易的获得 ...
随机推荐
- Android版App的控件元素定位
前言 如何获取页面上各控件元素,无论是Web自动化还是App自动化,此步骤都是非常关键的! Web页面的控件元素可通过开发者选项(Chrome浏览器的F12)来协助定位,App端也是有相应的工具来协助 ...
- 面向对象基础——String类
String类的两种实例化方法 A:直接赋值 public class StringDemo01{ public static void main(String args[]){ String na ...
- 搭建mysql主从集群的步骤
前提条件是:须要在linux上安装4个mysql数据库,都须要配置完对应的信息. 须要搭建: mysql 01: 主数据库 master mysql 02 : ...
- iOS开发教程:Storyboard全解析-第一部分
本文转载至http://blog.csdn.net/chang6520/article/details/7945845 感谢原文作者分享 故事版(Storyboard)是一个能够节省你很多设计 ...
- mysql 修改语法格式
1.修改字段注释格式 alter table {table} modify column {column} {type} comment '{comment}';
- 2 Maven使用入门
一.编写pom.xml文件 Maven项目的核心是pom.xml.POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等等. ...
- git项目.gitignore文件不生效解决办法
配置好.gitignore文件如下: HELP.md /target/ !.mvn/wrapper/maven-wrapper.jar ### STS ### .apt_generated .clas ...
- Promise 源码分析
前言 then/promise项目是基于Promises/A+标准实现的Promise库,从这个项目当中,我们来看Promise的原理是什么,它是如何做到的,从而更加熟悉Promise 分析 从ind ...
- poj 1363 Rails (【栈的应用】 刘汝佳的写法 *学习)
Rails Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 25964 Accepted: 10199 Descripti ...
- 转:Windows下WSH/JS实现SVN服务器钩子脚本阻止提交空日志信息和垃圾文件
http://blog.csdn.net/caikanxp/article/details/8279921 如何强制用户在提交SVN时填写日志信息? 如果用户使用的都是TortoiseSVN客户端,可 ...