Android 解析任意层数Json,将Map、List对象封装为Json_android jsonobject 存放map-程序员宅基地

一个方法解析任意层数的json字符窜:使用正则表达式,递归算法,将jsonArray解析出后添加中List, JsonObject添加至Map 

新增:一个方法将Object封装为Json字符串,解决用户输入中带有特殊字符的问题

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONStringer;
import org.json.JSONTokener;
import cc.util.android.core.LogUtil;
import android.util.Log;
  
/**
 * 解析多层次Json字符串,封装多层Json,避免字符串中有特殊字符而出现的错误
 */
public class JsonUtil {
  
    private final static String regex = "\"([^\\\" ]+?)\":";
  
    /**
     * 一个方法解析多层json数据  json + 正则 + 递归
     * @see {@link java.util.regex.Matcher}, {@link java.util.regex.Pattern}
     * @param jsonStr
     * @return {@link java.util.Map} or {@link java.util.List} or {@link java.lang.String}
     */
    public static Object jsonParse(final String jsonStr) {
        if (jsonStr == null) throw new NullPointerException("JsonString shouldn't be null");
        try {
            if (isJsonObject(jsonStr)) {
                final Pattern pattern = Pattern.compile(regex);
                final Matcher matcher = pattern.matcher(jsonStr);
                final Map<String, Object> map = new HashMap<String, Object>();
                final JSONObject jsonObject = new JSONObject(jsonStr);
                try {
                    for (; matcher.find(); ) {
                        String groupName = matcher.group(1);
                        Object obj = jsonObject.opt(groupName);
                        //Log.e(groupName, obj+"");
                        if (isJsonObject(obj+"") || isJsonArray(obj+"")) {
                            matcher.region(matcher.end() + (obj+"").replace("\\", "").length(), matcher.regionEnd());
                            map.put(groupName, jsonParse(obj+""));
                        } else {
                            map.put(groupName, obj+"");
                        }
                    }
                } catch (Exception e) {
                    // TODO: handle exception
                    Log.e("object---error", e.getMessage()+"--"+e.getLocalizedMessage());
                }
                  
                return map;
            } else if (isJsonArray(jsonStr)) {
                List<Object> list = new ArrayList<Object>();
                try {
                    JSONArray jsonArray = new JSONArray(jsonStr);
                    for (int i = 0; i < jsonArray.length(); i++) {
                        Object object = jsonArray.opt(i);
                        list.add(jsonParse(object+""));
                    }
                } catch (Exception e) {
                    // TODO: handle exception
                    Log.e("array---error", e.getMessage()+"--"+e.getLocalizedMessage());
                }
                return list;
            }
        } catch (Exception e) {
            // TODO: handle exception
            Log.e("RegexUtil--regexJson", e.getMessage()+"");
        }
        return jsonStr;
    }
      
    /**
     * To determine whether a string is JsonObject {@link org.json.JSONObject}
     * @param jsonStr {@link java.lang.String}
     * @return boolean
     */
    private static boolean isJsonObject(final String jsonStr) {
        if (jsonStr == null) return false;
        return Pattern.matches("^\\{.*\\}$", jsonStr.trim());
    }
      
    /**
     * To determine whether a string is JsonArray {@link org.json.JSONArray};
     * @param jsonStr {@link java.lang.String}
     * @return boolean
     */
    private static boolean isJsonArray(final String jsonStr) {
        if (jsonStr == null) return false;
        return Pattern.matches("^\\[.*\\]$", jsonStr.trim());
    }
      
    /**
     * 将对象分装为json字符串 (json + 递归)
     * @param obj 参数应为{@link java.util.Map} 或者 {@link java.util.List}
     * @return
     */
    @SuppressWarnings("unchecked")
    public static Object jsonEnclose(Object obj) {
        try {
            if (obj instanceof Map) {   //如果是Map则转换为JsonObject
                Map<String, Object> map = (Map<String, Object>)obj;
                Iterator<Entry<String, Object>> iterator = map.entrySet().iterator();
                JSONStringer jsonStringer = new JSONStringer().object();
                while (iterator.hasNext()) {
                    Entry<String, Object> entry = iterator.next();
                    jsonStringer.key(entry.getKey()).value(jsonEnclose(entry.getValue()));
                }
                JSONObject jsonObject = new JSONObject(new JSONTokener(jsonStringer.endObject().toString()));
                return jsonObject;
            } else if (obj instanceof List) {  //如果是List则转换为JsonArray
                List<Object> list = (List<Object>)obj;
                JSONStringer jsonStringer = new JSONStringer().array();
                for (int i = 0; i < list.size(); i++) {
                    jsonStringer.value(jsonEnclose(list.get(i)));
                }
                JSONArray jsonArray = new JSONArray(new JSONTokener(jsonStringer.endArray().toString()));
                return jsonArray;
            } else {
                return obj;
            }
        } catch (Exception e) {
            // TODO: handle exception
            LogUtil.e("jsonUtil--Enclose", e.getMessage());
            return e.getMessage();
        }
    }
      
}
  
  
//解析时使用示例
Object object = JsonUtil.jsonParse(RegexPolicy.Json, jsonStr.substring(jsonStr.indexOf("{"),
                                    jsonStr.lastIndexOf("}")+1));
                            if (object instanceof String) {
                                Log.e("string", object.toString());
                            } else if (object instanceof Map) {
                                @SuppressWarnings("unchecked")
                                HashMap<String, Object> map = (HashMap<String, Object>)object;
                                Iterator<Entry<String, Object>>  iterator = map.entrySet().iterator();
                                while (iterator.hasNext()) {
                                    Entry<String, Object> entry = iterator.next();
                                    if (entry.getValue() instanceof List) {
                                        Log.e(entry.getKey(), entry.getValue().toString());
                                    } else {
                                        Log.e(entry.getKey(), entry.getValue().toString());
                                    }
                                }
                            } else if (object instanceof List) {
                                Log.e("list", object.toString());
                            }
  
//封装时使用示例
Map<String, Object> map = new HashMap<String, Object>();
        map.put("returnCode", "0");
        map.put("returnMsg", "成功");
        List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
        Map<String, Object> listMap = new HashMap<String, Object>();
        listMap.put("test", "测试");
        listMap.put("fuck", "fuck");
        list.add(listMap);
        list.add(listMap);
        map.put("returnStatus", list);
        LogUtil.e("fuck", JsonUtil.jsonEnclose(map).toString()+"---");
//封装时结果
{"returnCode":"0","returnStatus":[{"test":"测试","fuck":"fuck"},{"test":"测试","fuck":"fuck"}],"returnMsg":"成功"}---

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xj626361950/article/details/42917401

智能推荐

Linux之编译make常识_make -j12-程序员宅基地

文章浏览阅读2.3k次,点赞2次,收藏5次。1,make -j:通过在make后加-j可以加快编译速度。在使用make进行编译时,若只执行make指令则效率较低,若用make -j后面跟一个数值,比如make -j8,make -j12等则可以提高编译效率。make -j命令后面跟着线程数,12表示这个命令使用12线路去执行编译。假设我们的系统是cpu是12核,在不影响其他工作的情况下,我们可以用make -j12(注意make -j线程数不能超过电脑cpu的线程数)。cpu_num=`cat /proc/stat | grep cpu[_make -j12

单独谈谈 Android Cursor 的使用细节-程序员宅基地

文章浏览阅读1.1k次。使用过 SQLite 数据库对 Cursor 应该不陌生,这里单独拿出来谈一下,加深对Android SQLite中使用 Cursor 的理解。在你理解和使用 Android Cursor 的时候你必须先知道关于Cursor的几件事情:Cursor 是每行的集合。使用 moveToFirst() 定位第一行。你必须知道每一列的名称。你必须知道每一列的数据类型。Cur..._cursor.movetoposition(i);为啥每次访问都是第一个数据

如何用CodeBlocks分多个文件编写一个C++程序_cold blocks中建立empty和file的区别-程序员宅基地

文章浏览阅读3.4w次,点赞41次,收藏142次。网上有许多教程,说的是如何用codeblocks编写一个简单的C\C++程序,但没有说如果分多个文件编写程序效果会怎样?下面向大家介绍该如何做:1.首先打开codeblocks:2.单击“File"-"new"-“Projects",或者单击“Create a new project",如下:打开如下对话框:然后单击图中圈出的两项目中的任意一个。再单击“go":_cold blocks中建立empty和file的区别

YAML语言的介绍和语法规则_yaml语言中,字符串 浮点数-程序员宅基地

文章浏览阅读250次。内容转载自我的博客文章目录1. YAML语言概述2. YAML语言的对象3. YAML语言的数组4. YAML语言的复合结构5. YAML语言的纯量6. YAML语言的字符串7. YAML语言的引用1. YAML语言概述YAML 语言的基本语法规则如下大小写敏感使用缩进表示层级关系缩进时不允许使用Tab键,只允许使用空格。缩进的空格数目不重要,只要相同层级的元素左侧对齐即可# 表示注释,从这个字符一直到行尾,都会被解析器忽略YAML 支持的数据结构有三种对象:键值对的集合,又称._yaml语言中,字符串 浮点数

Gralloc 总结-程序员宅基地

文章浏览阅读3.8k次。从字面就可以看出来Gralloc接口是为了显示内存分配与释放 – Graphics Allocation。它的主要目的有三个:Ø 为应用分配显示用内存;Ø 可以把显示内存在不同进程间进行映射;Ø 同步通过加载gralloc抽象层(gralloc.xxx.so),可以打开fb设备(/dev/fb0)和gpu设备(/dev/graphic/),fb设备用于操作fram_gralloc

Groovy List 常用操作-程序员宅基地

文章浏览阅读2.9w次,点赞2次,收藏26次。1:集合克隆 def list1 = ['a', 'b', 'c'] def list2 = list1.clone()2:list遍历a:使用each进行遍历def list = [1, 2, 3] list.each { println "Item: $it" }it是是与当前元素对应的隐式参数..._groovy list

随便推点

【web课程设计网页规划与设计】基于HTML+CSS+JavaScript制作大学网站(11页)_基于+javascript&mysgl&html的学校官网-程序员宅基地

文章浏览阅读447次。 校园网页设计 、学校班级网页制作、学校官网、小说书籍、等网站的设计与制作。️HTML静态网页设计作业使用dreamweaver制作,采用DIV+CSS布局,共有多个页面,首页使用CSS排版比较丰富,色彩鲜明有活力。顶部导航及底部区域背景色为100%宽度,主体内容区域宽度 一套优质的网页设计应该包含 (具体可根据个人要求而定)网站布局方面:计划采用目前主流的、能兼容各大主流浏览器、显示效果稳定的浮动网页布局结构。网站程序方面:计划采用最新的网页编程语言HTML5+CSS3+JS程序语......_基于+javascript&mysgl&html的学校官网

JavaScript 之for循环打印金字塔图形_请用javascript编写一个程序,可以接收一个整数n层数,打印出金字塔一半。(使用for-程序员宅基地

文章浏览阅读9.4k次,点赞6次,收藏21次。需求:1、用for循环打印半个金字塔图形n=5:&lt;html&gt;&lt;head&gt;&lt;title&gt;打印半个金字塔&lt;/title&gt;&lt;script type="text/javascript"&gt;var n = window.prompt("请输入金字塔的高度(行数)"); for(var i=0;i&lt;=n;i_请用javascript编写一个程序,可以接收一个整数n层数,打印出金字塔一半。(使用for

Linux 2.6.18内核编译_编译linux2.6.18-程序员宅基地

文章浏览阅读1k次。2、下载2.6内核源码下载地址:http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz23、下载内核升级工具(1)下载module-init-tools-3.2.tar.bz2http://www.kernel.org/pub/linux/utils/kernel/module-init-tools/modul_编译linux2.6.18

auto-extending data file /ibdata1 is of a different size 17152 pages (rounded down to MB)_you need to use --log-bin to make --log-replica-up-程序员宅基地

文章浏览阅读1.6k次。问题描述:由于某一个mysql库经常性导致库崩溃,现在需要把该库迁移到另外一个库中,通过xtrabackup备份恢复,当恢复后无法正常启动mysql,查看日志提示如下内容:2018-09-05 10:01:29 20972 [Warning] You need to use --log-bin to make --binlog-format work.2018-09-05 10:01:29 ..._you need to use --log-bin to make --log-replica-updates work.

服务熔断之Google SRE弹性熔断算法_google sre 熔断器-程序员宅基地

文章浏览阅读1.5k次。一、熔断介绍在分布式系统中,一次完整的请求可能需要经过多个服务模块的调用,请求在多个服务中传递,服务对服务的调用会产生新的请求,这些请求共同组成了这次请求的调用链。当调用链中的某个环节,特别是下游服务不可用时,将会导致上游服务调用方不可用,最终将这种不可用的影响扩大到整个系统,导致整个分布式的不可用,引起服务雪崩现象。为了避免这种情况,在下游服务不可用时,保护上游服务的可用性显得极其重要。对此我们可以通过熔断的方式,通过及时熔断服务调用方和服务提供方的调用链,保护服务调用方资源,防止服务雪崩现象的出_google sre 熔断器

Ntrip协议相关(客户端软件或代码)_ntripdemo-程序员宅基地

文章浏览阅读8.9k次,点赞2次,收藏10次。NTRIPNetworked Transport of RTCM via Internet Protocolhttp://hi.baidu.com/study_then/blog/item/a510514ae796d12409f7ef09.htmlNtrip software which is part of an Ntrip Example Implementation is_ntripdemo

推荐文章

热门文章

相关标签