最近项目中用到json这个数据结构,由于jdk1.6并没有提供默认解析json的api,项目中选用了apache的json工具类来做解析,目前常用的json解析工具还有google提供的gson和阿里的fastjson。
网上瞅了半天,想了下,json解析无非是对字符串做遍历,忍不住自己尝试解析下,通过递归实现一次字符串的完整遍历来完成json字符串与Map的转换。
首先列出json中常用的几个特殊字符:' " : [ ] { }。
- ‘和"这两个字符之前的部分是json的key或是value,对于这种字符,只需要取出之间的字符串即可
- :这个字符之前的json的key,后面的是json的value
- []这两个字符之间的部分可以看做是java中的list,他们一般是json的value,因为json是按{key:value}这个格式来存储的,所以不会选择[]来作为json的key
- {}跟[]差不多,可以看做是java的map。
java解析json过程中,需要考虑{}和[]之间的嵌套,同时当前被解析节点的是在map还是list中,如:
{'_key1':'_v1','_key2':'_v2'} //其中_key1、_v1、_key2、_v2都是在map中。
而
{'_list':['a','b']} //a、b都是位于list中,而['a','b']则在map中。
实现方法:顺序解析json字符串,当遇到{}或[]时递归调用当前方法,递归完成之后将字符串搜索的位置移动到]或}处继续遍历。
代码如下:
package com.json; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import org.apache.log4j.Logger; @SuppressWarnings({"unchecked","rawtypes"}) public class JSON2Map{ private static final Logger log = Logger.getLogger("parse"); public static Map getMap(String json){ return parse(json); } public static Map parse(String json){ if(json == null){ log.error("json is null."); } HashMap jsonObj = new HashMap(); json = json.trim(); if(json.startsWith("{")){ parse(json.substring(1), jsonObj, true); } return jsonObj; } public static int parse(String json, Object obj, boolean isMap){ /* json: 待解析的json字符串 obj :当前json串的父节点 isMap: 当前解析的json串是位于map中还是list中。 */ HashMap jsonObject = null; ArrayList jsonArray = null; int word_s_position = 0; int word_e_position = 0; String word = ""; //'或"分隔符是一个单词开头还是结尾 boolean isStart = true; //当前值是json的key还是value boolean isKey = true; if(isMap){ jsonObject = (HashMap) obj; } else { jsonArray = (ArrayList) obj; } int len = json.length(); char current_char = ' '; for(int x=0; x<len; x++){ current_char = json.charAt(x); switch(current_char){ case '\'': case '\"': if(isStart) { word_s_position = x+1; isStart = false; } else { word_e_position = x; if(isMap){ //父节点为map if(isKey){ //当前为key word = json.substring(word_s_position, word_e_position); log.debug("current is key, the value is: >>>> "+word); jsonObject.put(word, null); } else { log.debug("current is value, the value is: >>>> "+json.substring(word_s_position, word_e_position)); jsonObject.put(word, json.substring(word_s_position, word_e_position)); isKey = true; } } else { jsonArray.add(json.substring(word_s_position, word_e_position)); } isStart = true; } break; case '{' : HashMap _jsonObj = new HashMap(); if(isMap){ jsonObject.put(word, _jsonObj); } else { jsonArray.add(_jsonObj); } int pass_obj_char = parse(json.substring(x+1), _jsonObj, true); x += pass_obj_char; log.debug("current parsing json string is : "+ json); log.debug("parsed json string is: " + json.substring(0, x)); log.debug("remain to parsing json string is:"+json.substring(x+1)); break; case '[' : ArrayList _jsonArray = new ArrayList(); if(isMap){ jsonObject.put(word, _jsonArray); } else { jsonArray.add(_jsonArray); } int pass_array_char = parse(json.substring(x+1), _jsonArray, false); x += pass_array_char; log.debug("current parsing json string is : "+ json); log.debug("parsed json string is: " + json.substring(0, x)); log.debug("remain to parsing json string is:"+json.substring(x+1)); break; case '}' : //结束当前map return x+1; case ']' : //结束当前list return x+1; case ',' : if(isMap){ isKey = true; } else { isKey = false; } break; case ':' : isKey = false; break; } } return json.length(); } }
调用方法
String json = "{'abc':'ac','acb':'ae','arr1':[{'subArr1':{'abc':'ac','acb':'ae','arr1':[{'subArr1':'subArr2'},{'subArr2':'subArr3'}]}},{'subArr2':'subArr3'}],'key2':'value2','et':{'ab':'er','a':'re'},'key1':'value1'}"; Map map = JSON2Map.getMap(json); log.debug(map);
相关推荐
Java解析JSON文件是Java开发中常见的一项任务,特别是在与Web服务交互或处理API响应时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其简洁和易于阅读及编写的特点,被广泛应用于网络数据传输...
此压缩包包含两个jar:json-lib-2.4-jdk15.jar和ezmorph-1.0.6.jar 这两个包都是java解析json数据的依赖包,而且是最新版,开源的东东好多人还要分,俺不要分,只希望对你有用。
Java解析JSON是一个常见的任务,特别是在开发Web服务或者与API交互时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Java中,我们可以使用多种库...
Java解析Json字符串是Java开发中常见的一项任务,特别是在与Web服务交互、数据交换或存储时。Json(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Java...
JSON官网上推荐的使用java解析json的类库,官网下载后的是未编译打包的java文件,这是我打包后的东东,使用时直接添加进Build path即可,简单实用……
### Java解析JSON的方法 在Java开发中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。因此,在处理Web服务、API接口等方面,JSON数据格式非常常见...
标题与描述均提到了“JAVA解析JSON”,这表明文档主要关注的是如何在Java环境中解析JSON数据。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Java...
Java解析JSON是一个常见的任务,特别是在开发Web服务或者处理API响应时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Java中,有许多库可以帮助...
标题提到的是“java解析json格式字符串所需jar包”,描述指出我们可以自行下载这些库。在提供的压缩包文件中,包含了以下几个关键的jar包: 1. **commons-collections-3.2.1.jar**:这是Apache Commons Collections...
本压缩包包含了7个用于Java解析JSON文件的必备jar包,通过解压并将这些jar包添加到您的项目类路径中,您可以轻松实现JSON处理。 1. **Jackson库**: - Jackson是Java最流行的JSON处理库之一,由 FasterXML 组织...
附件内容为:Java组装map数据,然后转换为json数据格式;Java解析json数据
总结,Java解析JSON主要依靠第三方库,如Jackson和Gson,它们提供了解析JSON字符串到Java对象,以及将Java对象序列化为JSON字符串的功能。对于复杂的JSON结构,可以通过创建相应的Java类来映射。在实际操作中,务必...
Java解析JSON源码是Java开发中的重要一环,因为JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,广泛应用于服务器与客户端之间的数据传输。本文将深入探讨如何在Java中解析JSON源码,以及如何利用...
3. **解析JSON字符串**:通过`JSONObject.fromObject()`或`JSONArray.fromObject()`方法将JSON格式的字符串转换为Java对象。 4. **序列化Java对象**:使用`JSONObject.toJSONString()`或`JSONArray.toJSONString()`...
使用该方法可以轻松解析JSON数组,方便取出JSON数据
以上就是Java解析JSON的两种常见方法:使用JSON库(如json-lib、Jackson或Gson)和Java内置API。选择哪种方式取决于项目需求,如性能、兼容性、易用性等。对于大型项目,推荐使用成熟的库,如Jackson,它提供了更...
Java解析JSON包主要涉及到的是如何在Java程序中处理JSON(JavaScript Object Notation)数据,这是一种轻量级的数据交换格式,广泛应用于服务器与客户端之间的数据通信。JSON格式易于人阅读和编写,同时也易于机器...