Android万能解析并获取Json数据
Android万能解析并获取Json数据,无需导包
想要解析Json数据,首先要了解Json数据的组成
Json的组成
在学习过程中,我查阅了许多关于JSON数据结构的信息。然而,在查阅的过程中发现所得的答案与我的预期并不完全一致。基于以上分析与思考,我对JSON数据的基本概念有了初步的认识。
很简单地说明一下,在Json数据中分为两种基本结构:JsonObject 和 JsonArray 。
首先来看一下什么是 JsonObject :它是以{ }包裹的对象数据组,并且里面至少包含一个键值对(key-value)。
接着我们再来看看另一种情况:什么是 JsonArray ?它则是通过[ ]来表示数组数据组,并且里面同样至少包含一个具体的数组元素。
无论是哪种情况,在处理非常复杂的 Json 结构时都可以分解为这两个基本类型。就像俄罗斯套娃一样一层套一层形成复杂的数据关系。
知道组成之后我们就可以进行对数据的解析
解析Json数据就像是小偷去别人家里偷东西一样。
废话不多说,解析走起
从网站中获取Json数据,转化成String
private void sendRequsetWithOKHttp() {
new Thread(new Runnable() {
@Override
public void run() {
try{
//耗时操作放在新线程
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("这里放网址").build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
LinkedHashMap<String,Object> hashMaps=stringToJsonObject(responseData);
//把数据传出线程
Message message=new Message();
message.obj=hashMaps;
handler.sendMessage(message);
}catch (Exception e){
e.printStackTrace();
}
}
}).start();
}
不懂得小伙伴自行百度OKhttp
判断Json数据结构并分别解析
private LinkedHashMap<String, Object> stringToJsonObject(String response) {
try {
Object json=new JSONTokener(response).nextValue();
if(json instanceof JSONObject){
JSONObject jso = new JSONObject(response);
return JsonObjectToHashMap(jso);
}else{
JSONArray jsa=new JSONArray(response);
return JsonArrayToHashMap(jsa);
}
} catch (JSONException e) {
e.printStackTrace();
return null;
}
}
为了更好地整合数据资源,在系统中将从网站上提取的 Json 数据中的 String 类型字段整合到 Object 对象内,并根据其顶层结构判断其为 JsonArray 或 JsonObject 两种类型之一,从而完成后续处理流程。

JsonObject解析方法
private LinkedHashMap<String, Object> JsonObjectToHashMap(JSONObject jso) {
LinkedHashMap<String, Object> hashmap = new LinkedHashMap<>();
try {
for (Iterator<String> keyStr = jso.keys(); keyStr.hasNext(); ) {
String key1 = keyStr.next().trim();
if (jso.get(key1) instanceof JSONObject) {
JSONObject NextJSONObject=new JSONObject(jso.get(key1).toString());
hashmap.put(key1, JsonObjectToHashMap(NextJSONObject));
}else if(jso.get(key1) instanceof JSONArray) {
JSONArray NextJSONArray =new JSONArray(jso.get(key1).toString());
hashmap.put(key1, JsonArrayToHashMap(NextJSONArray));
}else {
hashmap.put(key1, jso.get(key1));
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return hashmap;
}
在之前的讨论中指出,JsonObject采用{Key, value}的形式,因此我通过迭代器提取出其中所有的Key。接着,我从提取出的Key中选取特定的key1,调用jso.get(key1)来判断其对应的value是否仍为JsonObject?这类似于小偷试图撬开门锁的过程:他复制了钥匙并尝试打开外部的门。如果是一个简单的 JsonObject(即纯JsonObject数据),则将其中的所有内容转移到 Hashmap 中;但如果是一个嵌套的 JsonObject(即 JsonObject内部包含其他 JsonObject),则继续深入处理。
JsonArray解析方法
private LinkedHashMap<String, Object> JsonArrayToHashMap(JSONArray jsa){
LinkedHashMap<String, Object> hashMap = new LinkedHashMap<>();
try {
for (int i = 0; i < jsa.length(); i++) {
if(jsa.get(i) instanceof JSONArray) {
JSONArray NextJSONArray=new JSONArray(jsa.get(i).toString());
hashMap.put(String.valueOf(i), JsonArrayToHashMap(NextJSONArray));
}else if(jsa.get(i) instanceof JSONObject){
JSONObject NextJSONObject=new JSONObject(jsa.get(i).toString());
hashMap.put(String.valueOf(i),JsonObjectToHashMap(NextJSONObject));
}
}
}catch (JSONException e){
e.getStackTrace();
}
return hashMap;
}
获取Json数据
在标准数据格式中(如JSON),Object与Hashmap遵循相同的键值对存储机制。然而,在实际应用中两者存在显著差异:前者支持有序插入特性而后者不具备这一功能。具体而言,在标准数据格式中(Object)类似于常见的{key, value}模式;而在JsonArray结构中则采用了数组存储方式,并不具备键值对的关系。当向容器中添加键值对时无需额外操作;而删除操作则需特别注意——这种无序访问的方式使得Array类型的容器难以满足需求。解决这一问题的方法较为简单:通过使用LinkedHashMap这一数据结构来实现有序插入,并保持键值对的顺序。

private String getpoint(LinkedHashMap<String ,Object> LinkedHashMap, String[] s){
String get=null;
String[] index=s;
LinkedHashMap<String ,Object> linked=LinkedHashMap;
for(int i = 0;i<sr.length;i++){
songs=linked.get(sr[i]);
if(songs instanceof LinkedHashMap){
linked=(LinkedHashMap<String ,Object>)songs;
continue;
}else {
get=songs.toString();
}
}
return get;
}
以上所述的是通用解析用于获取Json数据的一种方案。该方案虽已完善但还存在可供改进的空间,请各位专家不吝赐教。
