该工具类利用递归原理,能够将任意结构的json字符串进行解析。当然,如果需要解析为对应的实体对象时,就不能用了

package com.wot.cloudsensing.carrotfarm.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map; import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject; /**
* 将json字符串转换为对应的map等java对象 调用示例: CommonJSONParser commonJSONParser = new
* CommonJSONParser(); Map<String, Object> result =
* commonJSONParser.parse(jsonDataStr);
*
*/
public class JSonParserUtil {
public Map<String, Object> parse(String jsonStr) { Map<String, Object> result = null; if (null != jsonStr) {
try { JSONObject jsonObject = new JSONObject(jsonStr);
result = parseJSONObject(jsonObject); } catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // if (null != jsonStr) return result;
} private Map<String, Object> parseJSONObject(JSONObject jsonObject)
throws JSONException {
Map<String, Object> valueObject = null;
if (null != jsonObject) {
valueObject = new HashMap<String, Object>(); Iterator<String> keyIter = jsonObject.keys();
while (keyIter.hasNext()) {
String keyStr = keyIter.next();
Object itemObject = jsonObject.opt(keyStr);
if (null != itemObject) {
valueObject.put(keyStr, parseValue(itemObject));
} // if (null != itemValueStr) } // while (keyIter.hasNext())
} // if (null != valueStr) return valueObject;
} private Object parseValue(Object inputObject) throws JSONException { Object outputObject = null;
if (null != inputObject) { if (inputObject instanceof JSONArray) {
outputObject = parseJSONArray((JSONArray) inputObject);
} else if (inputObject instanceof JSONObject) {
outputObject = parseJSONObject((JSONObject) inputObject);
} else if (inputObject instanceof String
|| inputObject instanceof Boolean
|| inputObject instanceof Integer) {
outputObject = inputObject;
} } return outputObject;
} private List<Object> parseJSONArray(JSONArray jsonArray)
throws JSONException { List<Object> valueList = null; if (null != jsonArray) {
valueList = new ArrayList<Object>(); for (int i = 0; i < jsonArray.length(); i++) {
Object itemObject = jsonArray.get(i);
if (null != itemObject) {
valueList.add(parseValue(itemObject));
}
} // for (int i = 0; i < jsonArray.length(); i++)
} // if (null != valueStr) return valueList;
}
}

一个强大的json解析工具类的更多相关文章

  1. Dubbo 泛化调用的参数解析问题及一个强大的参数解析工具 PojoUtils

    排查了3个多小时,因为一个简单的错误,发现一个强大的参数解析工具,记录一下. 背景 Nodejs 通过 tether 调用 Java Dubbo 服务.请求类的某个参数对象 EsCondition 有 ...

  2. 一个.NET通用JSON解析/构建类的实…

    一个.NET通用JSON解析/构建类的实现(c#) 在.NET Framework 3.5中已经提供了一个JSON对象的序列化工具,但是他是强类型的,必须先按JSON对象的格式定义一个类型,并将类型加 ...

  3. C#字符串数组排序 C#排序算法大全 C#字符串比较方法 一个.NET通用JSON解析/构建类的实现(c#) C#处理Json文件 asp.net使用Jquery+iframe传值问题

    C#字符串数组排序   //排序只带字符的数组,不带数字的 private   string[]   aa   ={ "a ", "c ", "b & ...

  4. 一个.NET通用JSON解析/构建类的实现(c#)转

    转自:http://www.cnblogs.com/xfrog/archive/2010/04/07/1706754.html NET通用JSON解析/构建类的实现(c#) 在.NET Framewo ...

  5. 基于json-lib-2.2.2-jdk15.jar的JSON解析工具类大集合

    json解析之前的必备工作:导入json解析必须的六个包 资源链接:百度云:链接:https://pan.baidu.com/s/1dAEQQy 密码:1v1z 代码示例: package com.s ...

  6. 使用json-lib-*.jar的JSON解析工具类

    使用json-lib-2.4-jdk15.jar JSON工具类: import java.util.List; import net.sf.json.JSONArray; import net.sf ...

  7. json解析工具类

    对jackson的ObjectMapper的封装: ObjectMapperUtils: import static com.fasterxml.jackson.core.JsonFactory.Fe ...

  8. Json解析工具Jackson(使用注解)

    原文http://blog.csdn.net/nomousewch/article/details/8955796 接上一篇文章Json解析工具Jackson(简单应用),jackson在实际应用中给 ...

  9. Tomjson - 一个"短小精悍"的 json 解析库

    Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把Java对象(JavaBean)序列化为json格式字符串,将json格式字符 ...

随机推荐

  1. Mysql 表空间和 数据页空洞

    一.表空间1.表空间: innodb 引擎存储的最高层: 存放所有的数据2.独立表空间:Mysql 版本 5.6 后默认开启的单表单空间(1)Innodb 默认存储引擎页的大小为 16K :默认表空间 ...

  2. python-day1(学前了解)

    Markdown基本语法 各级标题 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 加粗 **加粗文本** 斜体 *我斜了* 高亮 ==我高亮了== 上标 2 ...

  3. layer.prompt绑定确认键

    case 'eventkc': top.layer.prompt({ formType: , title: '修改<span style="color:red">' + ...

  4. GDAL栅格矢量化

    在这里主要提供直接能用的栅格矢量化代码,这个函数中路径输入为QStrng,如果是其他类型的,请直接转成const char *: bool Polygonize(const QString& ...

  5. VMware虚拟机中CentOS/redhat设置固定IP

    你的笔记本中的VMware中redhat或centOS系统,如果想在上面建站,而又如果你需要在家里和公司都能访问该站(至少希望你自己的笔记本能访问),那么就需要将虚拟机IP设置为固定IP了.以下介绍两 ...

  6. vim 添加显示和行号

    方法一: 1.显示当前行行号,在VI的命令模式下输入 :nu 2.显示所有行号,在VI的命令模式下输入 :set nu :set nonu 关闭 方法二: 使用vi编辑~/.vimrc文件,在该文件中 ...

  7. zabbix修改默认字体

    在zabbixweb界面里有时候显示界面为框框 所以修改默认字体 现在windows里  随便找个字体: win+R  搜fonts 然后随便复制了一个字体,传到zabbix服务器里 cp calib ...

  8. 修改或删除windows上的git用户凭证信息

    参考博客:https://blog.csdn.net/qq_42249896/article/details/85207865

  9. C#文件路径操作总结

    一.获取当前文件的路径 1.   System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName     获取模块的完整路径,包括 ...

  10. 构造函数为何不能用abstract, static, final修饰

    不同于方法,构造器不能是abstract, static, final的. 1.构造器不是通过继承得到的,所以没有必要把它声明为final的. 2.同理,一个抽象的构造器将永远不会被实现,所以它也不能 ...