diff --git a/src/main/java/org/redkale/convert/json/JsonArray.java b/src/main/java/org/redkale/convert/json/JsonArray.java
index 48d021a3c..40447f640 100644
--- a/src/main/java/org/redkale/convert/json/JsonArray.java
+++ b/src/main/java/org/redkale/convert/json/JsonArray.java
@@ -15,6 +15,9 @@ import org.redkale.util.*;
*
*
详情见: https://redkale.org
*
+ * @see org.redkale.convert.json.JsonElement
+ * @see org.redkale.convert.json.JsonObject
+ * @see org.redkale.convert.json.JsonString
* @author zhangjx
* @since 2.8.0
*/
diff --git a/src/main/java/org/redkale/convert/json/JsonElement.java b/src/main/java/org/redkale/convert/json/JsonElement.java
index 52dac92fc..f8a53b774 100644
--- a/src/main/java/org/redkale/convert/json/JsonElement.java
+++ b/src/main/java/org/redkale/convert/json/JsonElement.java
@@ -10,6 +10,9 @@ import org.redkale.util.Utility;
*
*
详情见: https://redkale.org
*
+ * @see org.redkale.convert.json.JsonObject
+ * @see org.redkale.convert.json.JsonString
+ * @see org.redkale.convert.json.JsonArray
* @author zhangjx
* @since 2.8.0
*/
diff --git a/src/main/java/org/redkale/convert/json/JsonObject.java b/src/main/java/org/redkale/convert/json/JsonObject.java
index 5dac36f1d..7f1b4619f 100644
--- a/src/main/java/org/redkale/convert/json/JsonObject.java
+++ b/src/main/java/org/redkale/convert/json/JsonObject.java
@@ -15,6 +15,9 @@ import org.redkale.util.*;
*
*
详情见: https://redkale.org
*
+ * @see org.redkale.convert.json.JsonElement
+ * @see org.redkale.convert.json.JsonString
+ * @see org.redkale.convert.json.JsonArray
* @author zhangjx
* @since 2.8.0
*/
diff --git a/src/main/java/org/redkale/convert/json/JsonString.java b/src/main/java/org/redkale/convert/json/JsonString.java
index cda2df9d3..3da1faea0 100644
--- a/src/main/java/org/redkale/convert/json/JsonString.java
+++ b/src/main/java/org/redkale/convert/json/JsonString.java
@@ -10,6 +10,9 @@ import org.redkale.convert.ConvertDisabled;
*
*
详情见: https://redkale.org
*
+ * @see org.redkale.convert.json.JsonElement
+ * @see org.redkale.convert.json.JsonObject
+ * @see org.redkale.convert.json.JsonArray
* @author zhangjx
* @since 2.8.0
*/
diff --git a/src/main/java/org/redkale/util/AnyValue.java b/src/main/java/org/redkale/util/AnyValue.java
index f572f2eff..ac98fb268 100644
--- a/src/main/java/org/redkale/util/AnyValue.java
+++ b/src/main/java/org/redkale/util/AnyValue.java
@@ -11,6 +11,8 @@ import java.util.*;
import java.util.function.*;
import org.redkale.annotation.ConstructorParameters;
import org.redkale.convert.ConvertColumn;
+import org.redkale.convert.json.JsonArray;
+import org.redkale.convert.json.JsonObject;
import static org.redkale.util.Utility.isEmpty;
/**
@@ -1168,34 +1170,89 @@ public abstract class AnyValue {
public Properties toProperties() {
Properties props = new Properties();
- toProperties(props, new HashMap<>(), "", this);
+ toProperties(props, "", this);
return props;
}
- private static void toProperties(Properties props, Map keyPrefixs, String parent, AnyValue conf) {
- conf.forEach(
- (k, v) -> {
- final String prefix = parent + k;
- if (keyPrefixs.containsKey(prefix)) {
- String key = prefix;
- int index = keyPrefixs.get(key);
- if (index == -1) {
- key = prefix + "[" + (++index) + "]";
- props.put(key, props.remove(prefix));
- }
- key = prefix + "[" + (++index) + "]";
- while (props.containsKey(key)) {
- key = prefix + "[" + (++index) + "]";
- }
- props.put(key, v);
- keyPrefixs.put(prefix, index);
- } else {
- props.put(prefix, v);
- keyPrefixs.put(prefix, -1);
+ protected static void toProperties(Properties props, String parent, AnyValue conf) {
+ Map tmp = new HashMap<>();
+ Entry[] strs = conf.getStringEntrys();
+ if (strs != null && strs.length > 0) {
+ for (Entry en : strs) {
+ tmp.computeIfAbsent(en.getName(), k -> new ArrayList<>()).add(en.getValue());
+ }
+ tmp.forEach((k, list) -> {
+ if (list.size() == 1) {
+ props.put(parent + k, list.get(0));
+ } else {
+ int i = -1;
+ for (Object item : list) {
+ props.put(parent + k + "[" + (++i) + "]", item);
}
- },
- (k, c) -> {
- toProperties(props, keyPrefixs, parent + k + ".", c);
- });
+ }
+ });
+ }
+ Entry[] entrys = conf.getAnyEntrys();
+ if (entrys != null && entrys.length > 0) {
+ tmp.clear();
+ for (Entry en : entrys) {
+ tmp.computeIfAbsent(en.getName(), k -> new ArrayList<>()).add(en.getValue());
+ }
+ tmp.forEach((k, list) -> {
+ if (list.size() == 1) {
+ toProperties(props, parent + k + ".", (AnyValue) list.get(0));
+ } else {
+ int i = -1;
+ for (Object item : list) {
+ toProperties(props, parent + k + "[" + (++i) + "].", (AnyValue) item);
+ }
+ }
+ });
+ }
+ }
+
+ public JsonObject toJsonObject() {
+ JsonObject json = new JsonObject();
+ toJsonObject(json, this);
+ return json;
+ }
+
+ protected static void toJsonObject(JsonObject json, AnyValue conf) {
+ Map tmp = new HashMap<>();
+ Entry[] strs = conf.getStringEntrys();
+ if (strs != null && strs.length > 0) {
+ for (Entry en : strs) {
+ tmp.computeIfAbsent(en.getName(), k -> new JsonArray()).add(en.getValue());
+ }
+ tmp.forEach((k, list) -> {
+ if (list.size() == 1) {
+ json.put(k, list.get(0));
+ } else {
+ json.put(k, list);
+ }
+ });
+ }
+ Entry[] entrys = conf.getAnyEntrys();
+ if (entrys != null && entrys.length > 0) {
+ tmp.clear();
+ for (Entry en : entrys) {
+ tmp.computeIfAbsent(en.getName(), k -> new JsonArray()).add(en.getValue());
+ }
+ tmp.forEach((k, list) -> {
+ if (list.size() == 1) {
+ JsonObject val = new JsonObject();
+ toJsonObject(val, (AnyValue) list.get(0));
+ json.put(k, val);
+ } else {
+ JsonArray array = new JsonArray();
+ for (Object item : list) {
+ JsonObject val = new JsonObject();
+ toJsonObject(val, (AnyValue) item);
+ array.add(val);
+ }
+ json.put(k, array);
+ }
+ });
+ }
}
}
diff --git a/src/test/java/org/redkale/test/util/AnyValuePropertiesTest.java b/src/test/java/org/redkale/test/util/AnyValuePropertiesTest.java
index df0b31a27..d117454a0 100644
--- a/src/test/java/org/redkale/test/util/AnyValuePropertiesTest.java
+++ b/src/test/java/org/redkale/test/util/AnyValuePropertiesTest.java
@@ -6,6 +6,7 @@
package org.redkale.test.util;
import java.util.Properties;
+import java.util.TreeMap;
import org.junit.jupiter.api.*;
import org.redkale.util.AnyValue;
import org.redkale.util.AnyValueWriter;
@@ -152,22 +153,31 @@ public class AnyValuePropertiesTest {
@Test
public void run5() {
AnyValueWriter conf = AnyValue.create();
- conf.addValue("name", "haha");
- conf.addValue("name", "hehe");
+ conf.addValue("ns", "haha");
+ conf.addValue("ns", "hehe");
conf.addValue("status", 45);
conf.addValue("name", AnyValueWriter.create("id", 123).addValue("desc", "test"));
conf.addValue("nodes", AnyValueWriter.create("time", 123).addValue("time", 456));
+ conf.addValue("area", AnyValueWriter.create("areaid", 123).addValue("name", "aaa"));
+ conf.addValue("area", AnyValueWriter.create("areaid", 456).addValue("name", "bbb"));
Properties props1 = conf.toProperties();
- props1.forEach((k, v) -> System.out.println(k + " = " + v));
+ System.out.println(conf);
+ System.out.println(conf.toJsonObject());
+ System.out.println("----------------------------------------------------");
+ new TreeMap(props1).forEach((k, v) -> System.out.println(k + " = " + v));
Properties props2 = new Properties();
- props2.put("name[0]", "haha");
- props2.put("name[1]", "hehe");
+ props2.put("ns[0]", "haha");
+ props2.put("ns[1]", "hehe");
props2.put("status", "45");
props2.put("name.desc", "test");
props2.put("name.id", "123");
props2.put("nodes.time[0]", "123");
props2.put("nodes.time[1]", "456");
+ props2.put("area[0].areaid", "123");
+ props2.put("area[0].name", "aaa");
+ props2.put("area[1].areaid", "456");
+ props2.put("area[1].name", "bbb");
Assertions.assertEquals(props1.toString(), props2.toString());
System.out.println("------------------------ 05 ------------------------");