自定义test之java json字符串转map或list

     作者最近闲来无事利用java基本包写了一个简单的把json格式的字符串转为map或者list(根据输入的json格式自动判断),下面贴出代码,代码比较乱,只是简单的实现下功能,有不对之处还望给予指出。


import java.util.*;

public class JsonPrase2Test {


public static void main(String[] args) throws Exception {
String input = getInput();
Object obj = getObject(input);
System.out.println(obj);
/* input = input.replaceAll(" |\t|/n","");
if(input.length() < 2){
return ;
}
if('[' == input.charAt(0) && '{' != input.charAt(1)){
//list中 array类型json
List list = praseArrayJson(input,ArrayList.class);
System.out.println(list);
}else if('[' == input.charAt(0) && '{' == input.charAt(1)){
//list中 map类型json
List list = praseMapJson(input, ArrayList.class);
System.out.println(list);
}else {
// 纯map类型json
Map map = praseMap(input, null);
System.out.println(map);
}*/

/* Map<String,Object> map2 =new HashMap<String, Object>();
map2.put("key","value");
map2.put("key2","value2");
System.out.println(map2);*/
}
static private String getInput(){
Scanner scanner = new Scanner(System.in);
StringBuilder stringBuilder = new StringBuilder();
String temp = "start";
while((temp = scanner.nextLine()) != null && temp.length() >0){
stringBuilder.append(temp);
}
System.out.println(stringBuilder);
return stringBuilder.toString();
}

static public Object getObject(String input) throws Exception {
input = input.replaceAll(" |\t|/n","");
if(input.length() < 2){
return null;
}
if('[' == input.charAt(0) && '{' != input.charAt(1)){
//list中 array类型json
List list = praseArrayJson(input,ArrayList.class);
System.out.println(list);
return list;
}else if('[' == input.charAt(0) && '{' == input.charAt(1)){
//list中 map类型json
List list = praseMapJson(input, ArrayList.class);
System.out.println(list);
return list;
}else {
// 纯map类型json
Map map = praseMap(input, null);
System.out.println(map);
return map;
}
}

static private Map praseMap(String input,Class clazz) throws Exception {
if(input == null){
return null;
}
if(clazz == null){
return praseLinkHashMap(input, LinkedHashMap.class);
}else{
return praseLinkHashMap(input, clazz);
}

}

static private Map praseLinkHashMap(String input,Class type) throws Exception {
// input = input.replaceAll(" ","").replaceAll("\t","").replaceAll("\n","");//去除空格,tab,换行
input = input.replaceAll(" |\t|/n","");
Map<String,Object> map = (Map<String, Object>) Class.forName(type.getName()).newInstance();
// Map<String,Object> map = (Map<String, Object>) type.getDeclaredConstructor().newInstance();
Stack<Character> stack = new Stack<Character>();
Stack<Character> stackRef = new Stack<Character>();
Integer ref = 0;
char ch = input.charAt(0);
if(ch == '['){
throw new Exception("json数据格式不正确!");
}
if( ch != '{' ){
return null;
}
stack.push(input.charAt(0));
StringBuilder key = new StringBuilder();
StringBuilder value = new StringBuilder();
boolean hasValue = false;
for(int i=1;i<input.length();i++){
ch = input.charAt(i);

if(ch == '\"' && hasValue){ //避免值中带逗号(假设值中带逗号的值都是用双引号包含) 造成存key,value出错。
ref++;
if(ref % 2 == 0) {
stackRef.pop();
}else{
stackRef.push(ch);
}
continue;
}
if(ch == '\"'|| ch == '\'' || ch == ' '){
continue;
}

if(ch == ':'){
hasValue = true;// it's value
if(i+1 < input.length() && input.charAt(i+1) == '{'){ //需要去除空格 暂时没处理(方法开头统一处理了)

int left = input.indexOf("{",i+2);
int right = input.indexOf("}",i+2);
int leftCount = 0;
if(right == -1){
throw new Exception("json数据格式错误,缺少}");
}
if(left > right || left == -1){
map.put(key.toString(), praseLinkHashMap(input.substring(i+1, right+1), type));
i = right;
key = new StringBuilder();
value = new StringBuilder();
hasValue = false;
}else{
while(left < right && left != -1){//先找{}之间有多少个{
leftCount ++;
left = input.indexOf("{",left+1 < input.length()?left + 1 : input.length()-1);
}
while(leftCount > 0 && right != -1){//找匹配的}的位置
right = input.indexOf("}",right+1 < input.length()?right + 1 : input.length()-1);
if(right != -1){
leftCount --;
}
}
if(leftCount > 0){
throw new Exception("json数据格式错误,{}不匹配!");
}
map.put(key.toString(), praseLinkHashMap(input.substring(i+1,right+1),type));
i = right;
key = new StringBuilder();
value = new StringBuilder();
hasValue = false;

ref = 0;//存一次key,value后 重新初始化
stackRef.clear();//存一次key,value后 重新初始化
}
}else if(i+1 < input.length() && input.charAt(i+1) == '['){
Stack<Character> stack1 = new Stack<Character>();
stack1.push('[');
for(int j = i+2;j< input.length();j++){
if(input.charAt(j) == '['){
stack1.push('[');
}else if(input.charAt(j) == ']'){
char ch1 = stack1.pop();
if(ch1 == '[' && (stack1.empty() || stack1.size() == 0)){
if(j+1 < input.length()) {
map.put(key.toString(), praseMapJson(input.substring(i + 1, j + 1), ArrayList.class));
i = j;
key = new StringBuilder();
value = new StringBuilder();
hasValue = false;

ref = 0;//存一次key,value后 重新初始化
stackRef.clear();//存一次key,value后 重新初始化

break;
}else{
throw new Exception("json数据不正确,[]不匹配!");
}
}
}
}
if(!stack1.empty() || stack1.size() != 0){
throw new Exception("json数据不正确,[]不匹配!");
}
}
continue;
}
if(ch == ',' && (stackRef.isEmpty() || stackRef.size() == 0) ){
if(key != null && key.length() > 0){
map.put(key.toString(),value.toString());
}
key = new StringBuilder();
value = new StringBuilder();
hasValue = false;

ref = 0;//存一次key,value后 重新初始化
stackRef.clear();//存一次key,value后 重新初始化

continue;
}

if('{' == ch){
stack.push(ch);
}
if('}' == ch){
char temp = stack.pop();
if('}' == ch && '{' == temp){
continue;
}else {
throw new Exception("json格式不正确! 请检查{} []");
}
}
if(hasValue){
value.append(ch);
}else{
key.append(ch);
}
}

if(key != null && key.length() > 0){
map.put(key.toString(),value.toString());
}
return map;
}

static private List praseArrayJson(String input,Class clazz) throws Exception {
String time = clazz.getName();
List list = (List) Class.forName(clazz.getName()).newInstance();
// List list = (List) clazz.getDeclaredConstructor().newInstance();

if(input.charAt(0) != '[' || input.charAt(input.length()-1) != ']' ){
throw new Exception("json数据格式错误,[]不匹配!");
}
input = input.substring(1,input.length()-1);//去除字符串中的[]

String [] items = input.split(",");
for(String item:items){
if(item != null && item.length() > 0){
list.add(item);
}
}

return list;
}

static private List praseMapJson(String input,Class clazz) throws Exception {
List list = (List) Class.forName(clazz.getName()).newInstance();
// List list = (List) clazz.getDeclaredConstructor().newInstance();
Stack<Character> stackCheck = new Stack<Character>();
Stack<Character> stack = new Stack<Character>();
Stack<Integer> istack = new Stack<Integer>();
List<Map<String,Integer>> iList = new ArrayList<Map<String, Integer>>();
if(input.charAt(0) != '[' || input.charAt(input.length()-1) != ']'){
throw new Exception("json数据不正确,[]不匹配!");
}

if(input.charAt(1) != '{'){//数组 list<String>类型
return praseArrayJson(input,ArrayList.class);
}

for(int i = 1; i < input.length()-1; i++){

char ch = input.charAt(i);

if(ch == '['){
stackCheck.push(ch);
}else if(ch == ']'){
char charCheck = stackCheck.pop();
if(charCheck != '['){
throw new Exception("json数据不正确,[]不匹配!");
}
}


if (ch == '{' ) {
stack.push(ch);
istack.push(i);
}else if(ch == '}'){
char ch2 = stack.pop();
int i1 = istack.pop();
if(ch2 == '{' && (stack.empty() || stack.size() == 0)){
Map<String,Integer> subMap = new HashMap<String, Integer>();
subMap.put("startIndex",i1);
if(i+1 <= input.length()) {
subMap.put("endIndex", i + 1);
}else{
throw new Exception("json数据格式不正确!");
}
iList.add(subMap);
}
}
}

if(!stack.empty() || stack.size() != 0){
throw new Exception("json数据不正确,{}不匹配!");
}
if(!stackCheck.empty() || stackCheck.size() != 0){
throw new Exception("json数据不正确,[]不匹配!");
}

for(Map<String,Integer> map:iList){
list.add(praseLinkHashMap(input.substring(map.get("startIndex"),map.get("endIndex")),LinkedHashMap.class));
}

return list;
}


}

代码把json格式分了三类进行处理:字符串数组类型、普通对象数组类型、普通对象类型(有嵌套)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值