1、递归一
有的时候我们需要解析未知的json。或者说是动态的json。那么我们并不知道key具体是多少,或者说key不是固定的。这时候就需要解析动态key的方法。

这个方法是我在实现解析前台传入的json时所需要的。因为每个界面的前台传的是json是不固定的。如果真对每一个页面所传的数据都单独进行一次解析,那么太麻烦了。所以需要一个通用的解析方式。将其解析到map中。那么只需要调用该方法,就能获取到前台所传json对于的map。

在网上搜了一会,找不到我想要的方法,即不和我心意,代码又不给全。所以自己测试了一个简单的代码。我是使用递归实现的,代码简单。就不一一讲解了,如果还有不清楚的,请留言。

 import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set; import net.sf.json.JSONObject; public class JsonTest {
public static void main(String[] args) {
//测试字符串
String test = "{a:1,b:2,c:3,d:{q:4,w:5,e:6,y:{o:7,p:8}}}";
Map res = new HashMap();
//递归遍历解析方法
iteraJson(test,res);
//解析得到最终map后,遍历该map输出值
Set keySet = res.keySet();
Iterator iterator = keySet.iterator();
while(iterator.hasNext()){
String key = iterator.next().toString();
Object val = res.get(key);
System.out.println(key+":"+val.toString());
}
}
//递归遍历解析方法
public static boolean iteraJson(String str,Map res){
//因为json串中不一定有逗号,但是一定有:号,所以这里判断没有则已经value了
if(str.toString().indexOf(":") == -){
return true;
}
JSONObject fromObject = JSONObject.fromObject(str);
Iterator keys = fromObject.keys();
while(keys.hasNext()){
String key = keys.next().toString();
Object value = fromObject.get(key);
if(iteraJson(value.toString(),res)){
res.put(key, value);
}
}
return false;
}
}

效果如下:

2、递归二
上面的递归方式只支持没有包含数组格式的json字符串。例如:

String test = "{a:1,b:[1,2,3],c:3,d:{q:4,w:5,e:6,y:{o:7,p:8}},arry:[{name1:'joker',age:30},{name2:'dd',age:20},{name3:'bb',age:10}]}";

b:[1,2,3] 这个数组是正规数组,不是json数组,不需要解析。
arry:[{name1:’joker’,age:30},{name2:’dd’,age:20},{name3:’bb’,age:10}]。这个是json数组,需要继续解析。
要实现这两个格式的兼容。下面的代码能够实现:

     public static boolean iteraJsonOrArray(String source,Map map){
if(source.indexOf(":") == -){
return true;
}
JSONObject fromObject = JSONObject.fromObject(source);
Iterator keys = fromObject.keys();
while(keys.hasNext()){
String key = keys.next().toString();
Object value = fromObject.get(key);
String val = value.toString();
if(val.indexOf("[{") == -){
//说明不存在数组json即格式为:"[{" 开头的数据。可以允许是[10,11,12]的非json数组
if(val.indexOf(":") == -){
map.put(key, val);
}else{
iteraJson(val,map);
}
}else if(val.indexOf("[{") != -){
//说明存在数组json即格式为:[{开头的json数组
if(val.indexOf("[{") == ){
//说明当前value就是一个json数组
//去除[括号
String jsons = val.substring(, val.lastIndexOf("]"));//得到数据格式为:{...},{...},{...}
//把上面得到jsons分割成数组
//因为数据格式为{name:joker,age:20},{...},{...},所以不能用逗号分割。否则会变"{name:joker" "age:20}"
//使用正则表达式把},{替换成}|{
jsons = jsons.replaceAll("\\}\\s?,\\s?\\{", "}|{");
String[] split = jsons.split("\\|");
for(int i = ; i < split.length;i++){
iteraJsonOrArray(split[i],map);//符合当前递归条件
} }else{
//说明value可能是一个json,这个json中任然包含数组。例如:{inner:[{a:1,b:2,c:3}]}
iteraJsonOrArray(val,map);//符合当前递归条件
}
} } return false;
}

把 iteraJsonOrArray 方法写到递归一中的代码里。因为这个方法里调用了递归一中的iteraJson来解析没包含任何数组类型的json串。

执行代码

 String test = "{a:1,b:[1,2,3],c:3,d:{q:4,w:5,e:6,y:{o:7,p:8}},arry:[{name1:'joker',age:30},{name2:'dd',age:20},{name3:'bb',age:10}]}";
Map res = new HashMap();
iteraJsonOrArray(test,res);
Set keySet = res.keySet();
Iterator iterator = keySet.iterator();
while(iterator.hasNext()){
String key = iterator.next().toString();
Object val = res.get(key);
System.out.println(key+":"+val.toString());
}

效果如下:

注意:上图中 的name我分为name1,name2,name3。上图只有一个age。因为key重名了,所以放入map中自然会被覆盖掉。如果三个name一样,最后只能得到一个name一个age.
**

3、递归三
**
递归二的方式可以实现大部分json格式。但是遇到key相同的json就不好保存数据。
比如:{arry:[{name:joker,age:15},{name:jake,age:20},{name:mari,age:25}]};这种格式用递归二的话,放入map中,最后只得到name:mari 和 age:25。

所以我们需要把所有的值都保存起来,那么就不是放入map中,而是list中了。
如下图,在递归二中创建临时tempmap和list。然后把list添加到最终map中。

输出结果为:

这样就可以接受前台传到后台的json数据。这个json数据可以包含表单的值和表格的值一起。
---------------------

转自:https://blog.csdn.net/Esc_Tab_End/article/details/80210659

Android 解析未知格式的json数据的更多相关文章

  1. Android解析中国天气接口JSon数据,应用于天气查询!

    android解析Json数据是比较常见的一种操作.也是客户端和服务器进行数据交互的桥梁.下面就来看一看在android中解析JSon数据的方法吧. 首先要想获得Json数据,就必须访问相关的网络接口 ...

  2. android客户端从服务器端获取json数据并解析的实现代码

    今天总结一下android客户端从服务器端获取json数据的实现代码,需要的朋友可以参考下   首先客户端从服务器端获取json数据 1.利用HttpUrlConnection /** * 从指定的U ...

  3. (转)android客户端从服务器端获取json数据并解析的实现代码

    今天总结一下android客户端从服务器端获取json数据的实现代码,需要的朋友可以参考下       首先客户端从服务器端获取json数据 1.利用HttpUrlConnection   复制代码 ...

  4. 使用GSON和泛型解析约定格式的JSON串(转)

    时间紧张,先记一笔,后续优化与完善. 解决的问题: 使用GSON和泛型解析约定格式的JSON串. 背景介绍: 1.使用GSON来进行JSON串与java代码的互相转换. 2.JSON的格式如下三种: ...

  5. Ajax之处理不同格式的JSON数据

    JSON是一种网络中的数据格式,主要用于网络间的数据传输,它比XML格式的数据传输速度快,使用更广. 1.Ajax处理对象格式的JSON数据: <script src="../JS/j ...

  6. Java 和 Python 解析动态 key 的 JSON 数据

    一.概述 解析JSON过程中,什么情况都可能遇到.遇到特殊的情况,不会怎么办?肯定不是设计的问题,一定是你的姿势不对. 有这样一种JSON需要解析: { "b3444533f6544&quo ...

  7. python中jsonpath模块,解析多层嵌套的json数据

    1. jsonpath介绍用来解析多层嵌套的json数据;JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, ...

  8. android客户端从服务器端获取json数据并解析的实现代码(重要)

    首先客户端从服务器端获取json数据 1.利用HttpUrlConnection /** * 从指定的URL中获取数组 * @param urlPath * @return * @throws Exc ...

  9. iOS解析Server端返回JSON数据

    在做quhao APP架构时,后台Server端使用了Java,提供WebService,而iOS和Android作为移动客户端.在做数据交互时,Server端返回JSON格式数据.由于iOS SDK ...

随机推荐

  1. malloc函数详解 C语言逻辑运算符

    今天写线性表的实现,又遇到了很多的难题,C语言的指针真的没学扎实.很多基础都忘了. 一是 :malloc 函数的使用. 二是:C语言逻辑运算符. 一.原型:extern void *malloc(un ...

  2. FTL常用标签及语法

    判断对象是否存在,若成立说明存在 <#if blockObjList ??></#if> <#if blockObjList ??>  <#else>  ...

  3. Linux系统模式之间的转换

    1.默认开机进入文本模式 如果想让开机自动进纯文本模式, 修改/etc/inittab 找到其中的 id:5:initdefault: 这行指示启动时的运行级是5,也就是图形模式 改成3就是文本模式了 ...

  4. Android软件设计规范---命名规则/代码包设计规则等

    如果你将源码作为产品发布,就需要确认它是否被很好地打包并且清晰无误,一如你已构建的其他任何产品. 作为软件设计师,代码即是产品:不仅需要实现功能,还需有“优美.大方”的外表. 标识符命名法,标识符命名 ...

  5. 如何使用TDD和React Testing Library构建健壮的React应用程序

    如何使用TDD和React Testing Library构建健壮的React应用程序 当我开始学习React时,我努力的一件事就是以一种既有用又直观的方式来测试我的web应用程序. 每次我想测试它时 ...

  6. 解决IDEA Springboot项目sql文件打开提示No data sources are configured to run this SQL and provide advanced的问题

    Idea2018的Springboot项目,如果里面有.sql文件,打开后,会提示"No data sources are configured to run this SQL and pr ...

  7. 天天爱跑步 [NOIP2016]

    Description 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务.这个游戏的地图可 ...

  8. Java中Double类型的精确计算

    import java.math.BigDecimal; public class DoubleUtil { private static final int DEF_DIV_SCALE = 5; / ...

  9. spring中的多线程aop方法拦截

    日常开发中,常用spring的aop机制来拦截方法,记点日志.执行结果.方法执行时间啥的,很是方便,比如下面这样:(以spring-boot项目为例) 一.先定义一个Aspect import org ...

  10. 9款国内外垂直领域的在线作图工具:那些可以替代Visio的应用!【转】

    http://www.csdn.net/article/2015-02-12/2823939 摘要:现在越来越多的创业公司都希望提升办公的效率,今天介绍的几款也能提升办公效率,不过它们都属于垂直领域的 ...