用递归方式在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)提供了一种便利的方式使得我们进行递归查询.所谓递归查询方便对某个表进行不断的递归从而更加容易的获得 ...
随机推荐
- STL algorihtm算法iter_swap(29)
iter_swap原型: std::iter_swap template <class ForwardIterator1, class ForwardIterator2> void ite ...
- ios上视频与音乐合成后出现播放兼容问题的解决方法
近期EasyDarwin开源流媒体团队EasyVideoRecorder小组同学Carl在支持一款短视频应用上线时,遇到一个问题:我们在IOS上合成"图片+音乐"成为视频之后,在P ...
- ABAP 动态where 使用
REPORT ztest001_xch. TABLES: makt. DATA where_tab() OCCURS WITH HEADER LINE. DATA : wa_itab LIKE mak ...
- Cocos2d-x动画播放(序列帧)
简介 Cocos2d-x中,动画的具体内容是依靠精灵显示出来的,为了显示动态图片,我们需要不停切换精灵显示的内容,通过把静态的精灵变为动画播放器从而实现动画效果.动画由帧组成,每一帧都是一个纹理,我们 ...
- 数据结构之 线性表---单链表的操作B(先逆序+再删除重复元素)
数据结构上机测试2-2:单链表操作B Time Limit: 1000MS Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删 ...
- Js中获取显示器、浏览器以及窗口等的宽度与高度的方法
网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWid ...
- Python GIL、线程锁、信号量及事件
GIL是什么? GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念.就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码.有名的编 ...
- javaScrpit中NaN的秘密
NaN,不是一个数字,是一种特殊的值来代表不可表示的值,使用typeof或其他任何与之比较的处理方式,‘NaN’则会引起一些混乱, 一些操作会导致NaN值的产生.这里有些例子: Math.sqrt(- ...
- 并不对劲的bzoj3677:p3647:[APIO2014]连珠线
题目大意 有一种生成\(n\)个点的树的方法为: 一开始有一个点,\(n-1\)次操作,每次可以有两种操作:1.选一个点,用一条红边将它与新点连接:2.将新点放在一条红边上,新点与这条红边两端点直接的 ...
- HihoCoder 1504 : 骑士游历 (矩阵乘法)
描述 在8x8的国际象棋棋盘上给定一只骑士(俗称“马”)棋子的位置(R, C),小Hi想知道从(R, C)开始移动N步一共有多少种不同的走法. 输入 第一行包含三个整数,N,R和C. 对于40%的数据 ...