`
freshman0
  • 浏览: 9457 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

java解析json

阅读更多

      最近项目中用到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 解析 json文件

    Java解析JSON文件是Java开发中常见的一项任务,特别是在与Web服务交互或处理API响应时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其简洁和易于阅读及编写的特点,被广泛应用于网络数据传输...

    java解析json的jar包

    此压缩包包含两个jar:json-lib-2.4-jdk15.jar和ezmorph-1.0.6.jar 这两个包都是java解析json数据的依赖包,而且是最新版,开源的东东好多人还要分,俺不要分,只希望对你有用。

    java解析json完整案例

    Java解析JSON是一个常见的任务,特别是在开发Web服务或者与API交互时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Java中,我们可以使用多种库...

    java解析Json字符串

    Java解析Json字符串是Java开发中常见的一项任务,特别是在与Web服务交互、数据交换或存储时。Json(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Java...

    使用java解析json格式的字符串

    JSON官网上推荐的使用java解析json的类库,官网下载后的是未编译打包的java文件,这是我打包后的东东,使用时直接添加进Build path即可,简单实用……

    java解析json的方法

    ### Java解析JSON的方法 在Java开发中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。因此,在处理Web服务、API接口等方面,JSON数据格式非常常见...

    JAVA解析JSON相关.docx

    标题与描述均提到了“JAVA解析JSON”,这表明文档主要关注的是如何在Java环境中解析JSON数据。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Java...

    java解析JSON所需的全部jar包

    Java解析JSON是一个常见的任务,特别是在开发Web服务或者处理API响应时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Java中,有许多库可以帮助...

    java解析json格式字符串所需jar包

    标题提到的是“java解析json格式字符串所需jar包”,描述指出我们可以自行下载这些库。在提供的压缩包文件中,包含了以下几个关键的jar包: 1. **commons-collections-3.2.1.jar**:这是Apache Commons Collections...

    java解析json文件所需jar包

    本压缩包包含了7个用于Java解析JSON文件的必备jar包,通过解压并将这些jar包添加到您的项目类路径中,您可以轻松实现JSON处理。 1. **Jackson库**: - Jackson是Java最流行的JSON处理库之一,由 FasterXML 组织...

    Java组装json和java解析json数组

    附件内容为:Java组装map数据,然后转换为json数据格式;Java解析json数据

    JAVA 解析JSON格式数据

    总结,Java解析JSON主要依靠第三方库,如Jackson和Gson,它们提供了解析JSON字符串到Java对象,以及将Java对象序列化为JSON字符串的功能。对于复杂的JSON结构,可以通过创建相应的Java类来映射。在实际操作中,务必...

    Java解析JSON源码

    Java解析JSON源码是Java开发中的重要一环,因为JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,广泛应用于服务器与客户端之间的数据传输。本文将深入探讨如何在Java中解析JSON源码,以及如何利用...

    json-lib包(Java解析JSON的所有依赖包)

    3. **解析JSON字符串**:通过`JSONObject.fromObject()`或`JSONArray.fromObject()`方法将JSON格式的字符串转换为Java对象。 4. **序列化Java对象**:使用`JSONObject.toJSONString()`或`JSONArray.toJSONString()`...

    java解析JSON数据

    使用该方法可以轻松解析JSON数组,方便取出JSON数据

    java解析Json的两种方式

    以上就是Java解析JSON的两种常见方法:使用JSON库(如json-lib、Jackson或Gson)和Java内置API。选择哪种方式取决于项目需求,如性能、兼容性、易用性等。对于大型项目,推荐使用成熟的库,如Jackson,它提供了更...

    java解析json包

    Java解析JSON包主要涉及到的是如何在Java程序中处理JSON(JavaScript Object Notation)数据,这是一种轻量级的数据交换格式,广泛应用于服务器与客户端之间的数据通信。JSON格式易于人阅读和编写,同时也易于机器...

Global site tag (gtag.js) - Google Analytics