private Topology modifyStateByReplaceAll(String topologyStr) {
topologyStr = topologyStr.replaceAll("\"status\":[012456789]", "\"status\":0").replace("\"status\":3", "\"status\":1");
return JSON.parseObject(topologyStr,Topology.class);
public void test() {
String s = "{\"id\":\"10081\",\"status\":3,\"address\":\"zg\",\"child_list\":[{\"id\":\"10081\",\"status\":1,\"address\":\"zg\",\"child_list\":null},{\"id\":\"10082\",\"status\":2,\"address\":\"mg\",\"child_list\":[{\"id\":\"10081\",\"status\":5,\"address\":\"zg\",\"child_list\":null}]}]}";
System.out.println("原数据:===" + s);
Topology topology= JSON.parseObject(s, Topology.class);
Topology topologyNew1 = modifyStateByRecursion(topology);
System.out.println("递归处理后的数据:===" +JSON.toJSONString(topologyNew1));
Topology topologyNew2 = modifyStateByReplaceAll(s);
System.out.println("正则匹配处理后的数据:===" +JSON.toJSONString(topologyNew2));
####原数据####
"id": "10081",
"status": 3,
"address": "zg",
"child_list": [{
"id": "10081",
"status": 1,
"address": "zg",
"child_list": null
"id": "10082",
"status": 2,
"address": "mg",
"child_list": [{
"id": "10081",
"status": 5,
"address": "zg",
"child_list": null
####递归解析设置处理后的数据####
"address": "zg",
"child_list": [{
"address": "zg",
"id": "10081",
"status": 0
"address": "mg",
"child_list": [{
"address": "zg",
"id": "10081",
"status": 0
}],
"id": "10082",
"status": 0
}],
"id": "10081",
"status": 1
####replaceAll正则处理后的数据####
"address": "zg",
"child_list": [{
"address": "zg",
"id": "10081",
"status": 0
"address": "mg",
"child_list": [{
"address": "zg",
"id": "10081",
"status": 0
}],
"id": "10082",
"status": 0
}],
"id": "10081",
"status": 1
背景版本兼容性问题,需要对树形结构的数据的某一属性值特殊处理,想到了两种处理方式,一种递归解析设置,另一种replaceAll正则匹配替换,最终还是选择使用replaceAll,原来replaceAll这么好用。。解决步骤1.数据结构Topology如下package entity;import com.alibaba.fastjson.annotation.JSONField;import lombok.AllArgsConstructor;import lombok.Data;impo
import net.sf.ezmorph.object.DateMorpher;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.util.JSONUtils;
public class Jsontest {
* @param args
public static void main(String[] args) {
// TODO Auto-generated method stub
JSONObject jsonObj = new JSONObject();
jsonObj.put("name", "hzj");
jsonObj.put("sex", "female");
System.out.println(jsonObj);
public static Object jsonToBean(String jsonString, Class cla) {
JSONObject jsonObj = null;
try {
setDateFormat2Java();
jsonObj = JSONObject.fromObject(jsonString);
} catch (Exception ex) {
ex.printStackTrace();
return JSONObject.toBean(jsonObj, cla);
public static Object jsonToBean(String jsonString, Class cla, Map map) {
JSONObject jsonObj = null;
try {
setDateFormat2Java();
jsonObj = JSONObject.fromObject(jsonString);
} catch (Exception ex) {
ex.printStackTrace();
return JSONObject.toBean(jsonObj, cla, map);
public static Object[] jsonToArray(String jsonString, Class cla) {
Object[] arrObj = null;
try {
setDateFormat2Java();
JSONArray array = JSONArray.fromObject(jsonString);
arrObj = new Object[array.size()];
for (int i = 0; i < array.size(); i++) {
JSONObject jsonObject = array.getJSONObject(i);
arrObj[i] = JSONObject.toBean(jsonObject, cla);
} catch (Exception ex) {
ex.printStackTrace();
return arrObj;
public static Object[] jsonToArray(String jsonString, Class cla, Map map) {
Object[] arrObj = null;
try {
setDateFormat2Java();
JSONArray array = JSONArray.fromObject(jsonString);
arrObj = new Object[array.size()];
for (int i = 0; i < array.size(); i++) {
JSONObject jsonObject = array.getJSONObject(i);
arrObj[i] = JSONObject.toBean(jsonObject, cla, map);
} catch (Exception ex) {
ex.printStackTrace();
return arrObj;
public static List jsonToList(String jsonString, Class cla) {
List list = null;
try {
setDateFormat2Java();
JSONArray array = JSONArray.fromObject(jsonString);
list = new ArrayList();
for (Iterator iter = array.iterator(); iter.hasNext();) {
JSONObject jsonObject = (JSONObject) iter.next();
list.add(JSONObject.toBean(jsonObject, cla));
} catch (Exception ex) {
ex.printStackTrace();
return list;
public static List jsonToList(String jsonString, Class cla, Map map) {
List list = null;
try {
setDateFormat2Java();
JSONArray array = JSONArray.fromObject(jsonString);
list = new ArrayList();
for (Iterator iter = array.iterator(); iter.hasNext();) {
JSONObject jsonObject = (JSONObject) iter.next();
list.add(JSONObject.toBean(jsonObject, cla, map));
} catch (Exception ex) {
ex.printStackTrace();
return list;
public static Map jsonToMap(String jsonString) {
Map map = null;
try {
setDateFormat2Java();
JSONObject jsonObject = JSONObject.fromObject(jsonString);
map = new HashMap();
for (Iterator iter = jsonObject.keys(); iter.hasNext();) {
String key = (String) iter.next();
map.put(key, jsonObject.get(key));
} catch (Exception ex) {
ex.printStackTrace();
return map;
public static Object[] jsonToArray(String jsonString) {
JSONArray jsonArray = JSONArray.fromObject(jsonString);
return jsonArray.toArray();
public static void setDateFormat2Java() {
JSONUtils.getMorpherRegistry().registerMorpher(
new DateMorpher(new String[] { "yyyy-MM-dd",
"yyyy-MM-dd HH:mm:ss" }));
//targetArr 目标数组 rootObj 根节点
public JSONObject getJsonTree(JSONArray targetArr, JSONObject rootObj) {
JSONArray tempArr = new JSONArray();
// 筛选出当前根节点下的数组
for (int i = 0; i < targetArr.size(); i++) {
if (targetArr.getJSONObject(i).
JSON to Java Tree Model Example
Jackson提供了一个TreeNode类: com.fasterxml.jackson.databind.JsonNode。ObjectMapper提供了一个方法将JSON转换为一个以JsonNode作为根节点的TreeNode。这和DOM 节点在XML DMO树中比较相似。下面的栗子展示了从JSON字符串构建一棵树的过程;
pub...
export function InitializationTree(data = []) {
if (!data || !Array.isArray(data)) {
return;
// 循环遍历json数据
for (let i = 0; i < data.length; i++)
String str = "Hello World";
str = str.replaceAll("World", "Java");
System.out.println(str); // "Hello Java"
这里把"World"替换成了"Java"
<h3>回答2:</h3><br/>Java中的replaceAll()方法是用来替换字符串中的所有匹配项。正则表达式在此方法中起着关键作用,可以准确地查找匹配项并进行替换。
正则表达式是一种用于匹配文本的模式。在Java中使用正则表达式,需要利用java.util.regex包中的类和方法。正则表达式的基本语法如下:
1. 字符类:[],表示匹配在方括号内的任意一个字符。例如:[abc]表示匹配a、b或c中的任意一个字符。
2. 范围:-,表示匹配指定范围内的任意一个字符。例如:[a-z]表示匹配所有小写字母。
3. 表达式:.,表示匹配任意一个字符。
4. 特殊字符:\,表示转义字符。例如:\d表示匹配任意一个数字。
5. 次数:*、+、?、{n}、{n,}、{n,m},表示匹配次数。例如:a*表示匹配任意个a(包括0个);a+表示匹配至少一个a;a?表示匹配0个或1个a;a{n}表示匹配n个a;a{n,}表示匹配至少n个a;a{n,m}表示匹配n到m个a。
在Java中,使用正则表达式来替换字符串中的内容,需要使用replaceAll()方法。该方法接受两个参数,第一个参数是正则表达式,第二个参数是替换的内容。
例如,要将文本字符串中的所有空格替换为下划线,可以使用如下代码:
String str = "This is a test string.";
String newStr = str.replaceAll("\\s", "_");
在这个例子中,"\\s"表示空格字符,使用"\\"是因为在Java中"\"是一个转义字符。
在实际应用中,正则表达式的使用不仅限于替换字符串中的内容,还可以用来验证输入的数据格式、匹配URL、提取邮件地址等等。掌握正则表达式的基本语法和使用方法,对于Java程序员来说是非常重要的技能之一。
<h3>回答3:</h3><br/>在Java中,我们使用replaceAll()方法来替换字符串中的指定字符或字符串。正则表达式在其中也起到了非常重要的作用。
正则表达式是一组特殊字符和语法,它可以用来定义一些规则,用于匹配、查找、替换字符串中的特定模式。在Java中使用正则表达式的方法非常多,比如matches()、split()、replace()、replaceAll()等。
我们先来看一下replaceAll()方法的基本用法:
String str = "abcccdefg";
String replacedStr = str.replaceAll("c", "C");
System.out.println(replacedStr);
结果为abCCCdefg。
在上面的代码中,我们定义了一个字符串变量str,然后使用replaceAll()方法将字母c替换为字母C,并赋值给了另一个字符串变量replacedStr。最后输出replacedStr的值。
使用replaceAll()方法时,正则表达式也就相应地变得非常重要了。下面是一些正则表达式示例:
1. 将字符串中的所有空格替换成逗号:
String str = "This is a test string";
String replacedStr = str.replaceAll("\\s+", ",");
System.out.println(replacedStr);
结果为This,is,a,test,string。
在上面的代码中,我们使用了正则表达式\\s+来匹配一个或多个连续的空格,然后将其替换成了逗号。
2. 将字符串中的所有数字替换成星号:
String str = "my phone number is 123-456-7890";
String replacedStr = str.replaceAll("\\d", "*");
System.out.println(replacedStr);
结果为my phone number is ***-***-****。
在上面的代码中,我们使用了正则表达式\\d来匹配任意数字,然后将其替换成了星号。
3. 将字符串中的第一个单词替换成另一个单词:
String str = "The quick brown fox jumps over the lazy dog";
String replacedStr = str.replaceFirst("\\b\\w+\\b", "A");
System.out.println(replacedStr);
结果为A quick brown fox jumps over the lazy dog。
在上面的代码中,我们使用了正则表达式\\b\\w+\\b来匹配第一个完整的单词,然后将其替换成了字母A。
需要注意的是,在正则表达式中,一些特殊字符需要转义,比如在某些情况下,我们需要匹配一个点号(.),那么正则表达式应该写成"\\."。
总之,通过学习和掌握正则表达式,在Java中使用replaceAll()方法可以更加灵活和方便,能够帮助我们更好地处理和操作字符串。