用递归方式在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)提供了一种便利的方式使得我们进行递归查询.所谓递归查询方便对某个表进行不断的递归从而更加容易的获得 ...
随机推荐
- 在Fedora 25中更换openjdk为oracle jdk
本文修改自csdn: openjdk的好处是: 1.升级方便,fedora团队社区负责维护升级,安全稳定,质量有保证. 2.已经支持了很多应用:而且还越来越强大 3.支持eclipse开发. 实际上, ...
- iOS移动开发周报-第20期
iOS移动开发周报-第20期iOS移动开发周报-第20期 [摘要]:本期iOS移动开发周报带来如下内容:iOS 通知中心扩展制作入门,iOS APP可执行文件的组成,objc非主流代码技巧等. 教程 ...
- 如何在微信小程序中使用字体图标
微信小程序中,在image标签里,可以在src中引用本地文件,但是background设置背景图或者使用字体图标的时候,却不能引用本地文件,只能用url地址的图片或字体,或者使用base64编码后的格 ...
- ecshop 国付宝支付接口
function get_code($order, $payment){ $version = '2.2'; $charset = '1'; $language = '1'; $signType = ...
- javaScript中innerHTML,innerText,outerHTML,outerText的区别
开头说下innerText和outerText只在chrome浏览器中有效 定义和用法 innerHTML 属性设置或返回表格行的开始和结束标签之间的 HTML,包括标签. 来看代码 <!DOC ...
- 2018-11-13-常用模块1 (time random os sys)
1.时间模块 time 2.随机数模块 random 3.与操作系统交互模块 os 4.系统模块 sys 在我们真正开始学习之前我们先解决下面几个问题,打好学习模块的小基础,以便更好的学习模块. (1 ...
- SQL Server 2005中top关键字的用法
1.返回N条记录数 select top n * from <表名> [查询条件] 2.返回总结果集中指定百分比记录数 select top n percent * from <表名 ...
- 20170314 OO ALV 出现双滚动条
1.出现双进度条,用户改变屏幕大小操作出现问题: 解决方法: [园童]BJ-ABAP-可乐(708925365) 16:08:55240 * 200改为240 200,然后将滚动条的步进改为1即可 ...
- java JDBM2 的几个简单实例
JDBM2 提供了 HashMap 和 TreeMap 的磁盘存储功能,简单易用,用于持久化数据.特别适合用于嵌入到其他应用程序中. 磁盘数据库 HelloWorld.java import java ...
- SDUT OJ 之 1571 《人品,有没有?》 字符串的处理问题
人品,有木有? Time Limit: 1000ms Memory limit: 32768K 有疑问?点这里^_^ 题目描述 新一届的山东理工大学ACM网络擂台赛就要开始啦!听说晋级的选手有机 ...