JAVA_手写json解析器(jParser)

手写json解析器(jParser)

package 手写json解析器;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
 * <p>json数据处理类</p>
 * @author lius
 */
public class jsonHandler {
	/**
	 * 处理字符串json数据
	 * @param arrayStr
	 * @return
	 */
	private static String[] handlerJsonData(String arrayStr) {
		int turnOff = 0;
		//解密
		String[] strArray = arrayStr.replaceAll("@!g!@", ",").
				replaceAll("@!m!@", ":").split("");
		for (int t=0;t<strArray.length;t++) {
			
//			System.out.println(strArray[t]);
			if(turnOff==0 ||turnOff==1) {
				//加密
				if(strArray[t].equals(","))strArray[t] ="@!-!@";	
				if(strArray[t].equals("{") || strArray[t].equals("[")) 
				{strArray[t]=turnOff==0?"":strArray[t];turnOff++;};
				if(strArray[t].equals("}") || strArray[t].equals("]")) {
					--turnOff;if(turnOff ==0) strArray[t]="";	
				};
				strArray[t]=strArray[t].equals("\"")?"":strArray[t];
			}else {
				//加密
				if(strArray[t].equals(","))strArray[t] ="@!g!@";
				if(strArray[t].equals(":"))strArray[t] ="@!m!@";
				if(strArray[t].equals("{") || strArray[t].equals("["))turnOff++;
				if(strArray[t].equals("}") || strArray[t].equals("]")) {
					--turnOff;if(turnOff ==0) strArray[t]="";};
			}			
		}
		strArray = Stream.of(strArray).collect(Collectors.joining()).split("@!-!@");	
		return strArray;
	}
	/**
	 * 处理json map数据
	 * @param arrayStr
	 * @return
	 */
	private static Map<String,Object> parserMap(String arrayStr) {
		String[] strArray = handlerJsonData(arrayStr);
		Map<String, Object> value = Stream.of(strArray).map(str->{
			String[] kv = str.split(":");
			//解密
			kv[1]=kv[1].replaceAll("@!g!@", ",").replaceAll("@!m!@", ":");
			return kv;
		}).collect(Collectors.toMap((kv)->kv[0], (kv)->kv[1]));
		return value;
	}
	/**
	 * 处理json 集合list数据
	 * @param arrayStr
	 * @return
	 */
	private static List<String> parserArrays(String arrayStr) {
		String[] strArray = handlerJsonData(arrayStr);
		List<String> value = Stream.of(strArray)
				//解密
				.map(str->str.replaceAll("@!g!@", ",").replaceAll("@!m!@", ":"))
				.collect(Collectors.toList());
		return value;
	}
	
	
	
	/**
	 * <p>获取集合对象或元素</p>
	 * @param json
	 * @param index
	 * @param type
	 * @return
	 */
	protected static Object multiPartHandler(String json,String[] index,int type) {
		Object obj= null;
		int types = 0;
		for (String indexItem : index) {
			//判断json的结果类型
			if(json.charAt(0)=='{') {
				obj = type==0?parserMap(json)
						:parserMap(json).get(indexItem).toString();
			}else if(json.charAt(0)=='[') {
				obj = type==0?parserArrays(json)
						:parserArrays(json).get(Integer.parseInt(indexItem));
			}else {
				obj= null; 
			}
			json = obj.toString();
		}
		return obj;
	}
}
package 手写json解析器;
/**
 * jParser支持获取对象与元素,如果非正常json格式数据,或索引和key值不存在,结果将返回为空<null>
 * 1.获取对象:jParser.get(json数据,"第一个索引或者key值","第二个索引或者key值"...)
 * 2.获取元素:jParser.get(json数据,"第一个索引或者key值>第二个索引或者key值>..>..")
 * @author lius
 *
 */
public class jParser extends jsonHandler {
	/**
	 * <p>获取json的集合对象</p>
	 * @param json
	 * @param type
	 * @return
	 * 例如:json解析.get(data,"translateResult","0","0")
	 */
	public static Object get (String json,String... index) {
		return multiPartHandler(json, index, 0); 
	}
	/**
	 * <p>获取json的集合元素</p>
	 * @param json  data source
	 * @param index	index or key  
	 * @param type	result type
	 * @return
	 * 例如:json解析.get(data,"translateResult>0>0>tgt").toString()
	 */
	public static Object get (String json,String index) {
		String[] indexs = index.split(">");
		return multiPartHandler(json, indexs, 1);//0.获取集合对象 1.获取元素
	}
}

 

 源码地址:https://github.com/15238507298/jParser.git

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个用Java编写的手写词法分析器的示例代码: ```java import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class Lexer { private static final char EOF = (char) -1; private static final char EOL = '\n'; private static final String OPERATORS = "+-*/()"; private static final String DIGITS = "0123456789"; private BufferedReader reader; private char currentChar; public Lexer(String fileName) throws IOException { reader = new BufferedReader(new FileReader(fileName)); currentChar = (char) reader.read(); } public List<Token> tokenize() throws IOException { List<Token> tokens = new ArrayList<>(); while (currentChar != EOF) { if (currentChar == EOL) { consume(); continue; } if (Character.isWhitespace(currentChar)) { consume(); continue; } if (OPERATORS.indexOf(currentChar) != -1) { tokens.add(new Token(Token.Type.OPERATOR, Character.toString(currentChar))); consume(); continue; } if (DIGITS.indexOf(currentChar) != -1) { StringBuilder sb = new StringBuilder(); while (DIGITS.indexOf(currentChar) != -1) { sb.append(currentChar); consume(); } tokens.add(new Token(Token.Type.NUMBER, sb.toString())); continue; } throw new RuntimeException("Invalid character: " + currentChar); } return tokens; } private void consume() throws IOException { currentChar = (char) reader.read(); } } class Token { enum Type { OPERATOR, NUMBER } private Type type; private String value; public Token(Type type, String value) { this.type = type; this.value = value; } public Type getType() { return type; } public String getValue() { return value; } } ``` 这个词法分析器可以读取一个文件并将其分解为令牌。它支持四种类型的令牌:运算符、数字、换行符和文件结束符。它使用一个缓冲区来存储当前正在解析的符号,并使用一个符号类型的数组来存储确定模型的符号。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值