Android 解析未知格式的json数据
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数据的更多相关文章
- Android解析中国天气接口JSon数据,应用于天气查询!
android解析Json数据是比较常见的一种操作.也是客户端和服务器进行数据交互的桥梁.下面就来看一看在android中解析JSon数据的方法吧. 首先要想获得Json数据,就必须访问相关的网络接口 ...
- android客户端从服务器端获取json数据并解析的实现代码
今天总结一下android客户端从服务器端获取json数据的实现代码,需要的朋友可以参考下 首先客户端从服务器端获取json数据 1.利用HttpUrlConnection /** * 从指定的U ...
- (转)android客户端从服务器端获取json数据并解析的实现代码
今天总结一下android客户端从服务器端获取json数据的实现代码,需要的朋友可以参考下 首先客户端从服务器端获取json数据 1.利用HttpUrlConnection 复制代码 ...
- 使用GSON和泛型解析约定格式的JSON串(转)
时间紧张,先记一笔,后续优化与完善. 解决的问题: 使用GSON和泛型解析约定格式的JSON串. 背景介绍: 1.使用GSON来进行JSON串与java代码的互相转换. 2.JSON的格式如下三种: ...
- Ajax之处理不同格式的JSON数据
JSON是一种网络中的数据格式,主要用于网络间的数据传输,它比XML格式的数据传输速度快,使用更广. 1.Ajax处理对象格式的JSON数据: <script src="../JS/j ...
- Java 和 Python 解析动态 key 的 JSON 数据
一.概述 解析JSON过程中,什么情况都可能遇到.遇到特殊的情况,不会怎么办?肯定不是设计的问题,一定是你的姿势不对. 有这样一种JSON需要解析: { "b3444533f6544&quo ...
- python中jsonpath模块,解析多层嵌套的json数据
1. jsonpath介绍用来解析多层嵌套的json数据;JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, ...
- android客户端从服务器端获取json数据并解析的实现代码(重要)
首先客户端从服务器端获取json数据 1.利用HttpUrlConnection /** * 从指定的URL中获取数组 * @param urlPath * @return * @throws Exc ...
- iOS解析Server端返回JSON数据
在做quhao APP架构时,后台Server端使用了Java,提供WebService,而iOS和Android作为移动客户端.在做数据交互时,Server端返回JSON格式数据.由于iOS SDK ...
随机推荐
- malloc函数详解 C语言逻辑运算符
今天写线性表的实现,又遇到了很多的难题,C语言的指针真的没学扎实.很多基础都忘了. 一是 :malloc 函数的使用. 二是:C语言逻辑运算符. 一.原型:extern void *malloc(un ...
- FTL常用标签及语法
判断对象是否存在,若成立说明存在 <#if blockObjList ??></#if> <#if blockObjList ??> <#else> ...
- Linux系统模式之间的转换
1.默认开机进入文本模式 如果想让开机自动进纯文本模式, 修改/etc/inittab 找到其中的 id:5:initdefault: 这行指示启动时的运行级是5,也就是图形模式 改成3就是文本模式了 ...
- Android软件设计规范---命名规则/代码包设计规则等
如果你将源码作为产品发布,就需要确认它是否被很好地打包并且清晰无误,一如你已构建的其他任何产品. 作为软件设计师,代码即是产品:不仅需要实现功能,还需有“优美.大方”的外表. 标识符命名法,标识符命名 ...
- 如何使用TDD和React Testing Library构建健壮的React应用程序
如何使用TDD和React Testing Library构建健壮的React应用程序 当我开始学习React时,我努力的一件事就是以一种既有用又直观的方式来测试我的web应用程序. 每次我想测试它时 ...
- 解决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 ...
- 天天爱跑步 [NOIP2016]
Description 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务.这个游戏的地图可 ...
- Java中Double类型的精确计算
import java.math.BigDecimal; public class DoubleUtil { private static final int DEF_DIV_SCALE = 5; / ...
- spring中的多线程aop方法拦截
日常开发中,常用spring的aop机制来拦截方法,记点日志.执行结果.方法执行时间啥的,很是方便,比如下面这样:(以spring-boot项目为例) 一.先定义一个Aspect import org ...
- 9款国内外垂直领域的在线作图工具:那些可以替代Visio的应用!【转】
http://www.csdn.net/article/2015-02-12/2823939 摘要:现在越来越多的创业公司都希望提升办公的效率,今天介绍的几款也能提升办公效率,不过它们都属于垂直领域的 ...