新增:一个方法将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":"成功"}---
文章浏览阅读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
文章浏览阅读1.1k次。使用过 SQLite 数据库对 Cursor 应该不陌生,这里单独拿出来谈一下,加深对Android SQLite中使用 Cursor 的理解。在你理解和使用 Android Cursor 的时候你必须先知道关于Cursor的几件事情:Cursor 是每行的集合。使用 moveToFirst() 定位第一行。你必须知道每一列的名称。你必须知道每一列的数据类型。Cur..._cursor.movetoposition(i);为啥每次访问都是第一个数据
文章浏览阅读3.4w次,点赞41次,收藏142次。网上有许多教程,说的是如何用codeblocks编写一个简单的C\C++程序,但没有说如果分多个文件编写程序效果会怎样?下面向大家介绍该如何做:1.首先打开codeblocks:2.单击“File"-"new"-“Projects",或者单击“Create a new project",如下:打开如下对话框:然后单击图中圈出的两项目中的任意一个。再单击“go":_cold blocks中建立empty和file的区别
文章浏览阅读250次。内容转载自我的博客文章目录1. YAML语言概述2. YAML语言的对象3. YAML语言的数组4. YAML语言的复合结构5. YAML语言的纯量6. YAML语言的字符串7. YAML语言的引用1. YAML语言概述YAML 语言的基本语法规则如下大小写敏感使用缩进表示层级关系缩进时不允许使用Tab键,只允许使用空格。缩进的空格数目不重要,只要相同层级的元素左侧对齐即可# 表示注释,从这个字符一直到行尾,都会被解析器忽略YAML 支持的数据结构有三种对象:键值对的集合,又称._yaml语言中,字符串 浮点数
文章浏览阅读3.8k次。从字面就可以看出来Gralloc接口是为了显示内存分配与释放 – Graphics Allocation。它的主要目的有三个:Ø 为应用分配显示用内存;Ø 可以把显示内存在不同进程间进行映射;Ø 同步通过加载gralloc抽象层(gralloc.xxx.so),可以打开fb设备(/dev/fb0)和gpu设备(/dev/graphic/),fb设备用于操作fram_gralloc
文章浏览阅读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
文章浏览阅读447次。 校园网页设计 、学校班级网页制作、学校官网、小说书籍、等网站的设计与制作。️HTML静态网页设计作业使用dreamweaver制作,采用DIV+CSS布局,共有多个页面,首页使用CSS排版比较丰富,色彩鲜明有活力。顶部导航及底部区域背景色为100%宽度,主体内容区域宽度 一套优质的网页设计应该包含 (具体可根据个人要求而定)网站布局方面:计划采用目前主流的、能兼容各大主流浏览器、显示效果稳定的浮动网页布局结构。网站程序方面:计划采用最新的网页编程语言HTML5+CSS3+JS程序语......_基于+javascript&mysgl&html的学校官网
文章浏览阅读9.4k次,点赞6次,收藏21次。需求:1、用for循环打印半个金字塔图形n=5:<html><head><title>打印半个金字塔</title><script type="text/javascript">var n = window.prompt("请输入金字塔的高度(行数)"); for(var i=0;i<=n;i_请用javascript编写一个程序,可以接收一个整数n层数,打印出金字塔一半。(使用for
文章浏览阅读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
文章浏览阅读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.
文章浏览阅读1.5k次。一、熔断介绍在分布式系统中,一次完整的请求可能需要经过多个服务模块的调用,请求在多个服务中传递,服务对服务的调用会产生新的请求,这些请求共同组成了这次请求的调用链。当调用链中的某个环节,特别是下游服务不可用时,将会导致上游服务调用方不可用,最终将这种不可用的影响扩大到整个系统,导致整个分布式的不可用,引起服务雪崩现象。为了避免这种情况,在下游服务不可用时,保护上游服务的可用性显得极其重要。对此我们可以通过熔断的方式,通过及时熔断服务调用方和服务提供方的调用链,保护服务调用方资源,防止服务雪崩现象的出_google sre 熔断器
文章浏览阅读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