feat: fix "ABAC" model enforceEx error (#40)

diff --git a/examples/abac_model.conf b/examples/abac_model.conf
new file mode 100644
index 0000000..4198fd7
--- /dev/null
+++ b/examples/abac_model.conf
@@ -0,0 +1,11 @@
+[request_definition]
+r = sub, obj
+
+[policy_definition]
+p = sub, obj
+
+[policy_effect]
+e = some(where (p.eft == allow))
+
+[matchers]
+m = r.sub == r.obj.Owner
\ No newline at end of file
diff --git a/examples/abac_policy.csv b/examples/abac_policy.csv
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/examples/abac_policy.csv
diff --git a/src/main/java/org/casbin/CommandExecutor.java b/src/main/java/org/casbin/CommandExecutor.java
index 470030a..d8ebdf4 100644
--- a/src/main/java/org/casbin/CommandExecutor.java
+++ b/src/main/java/org/casbin/CommandExecutor.java
@@ -33,23 +33,29 @@
      * @return A JSON formatted string representing the key-value pairs from the input string.
      */
     public static String convertToJson(String input) {
-        input = input.trim().substring(1, input.length() - 1).trim();
-        StringBuilder jsonBuilder = new StringBuilder("{");
-        String[] pairs = input.split(",");
-        for (String pair : pairs) {
-            pair = pair.trim();
-            String[] keyValue = pair.split(":");
-            if (keyValue.length == 2) {
-                String key = keyValue[0].trim();
-                String value = keyValue[1].trim();
-                jsonBuilder.append("\"").append(key).append("\":").append(value).append(",");
+        input = input.trim();
+        // Handle the simple format {key: value}
+        if (!input.contains("\"")) {
+            input = input.substring(1, input.length() - 1).trim();
+            StringBuilder jsonBuilder = new StringBuilder("{");
+            String[] pairs = input.split(",");
+            for (String pair : pairs) {
+                pair = pair.trim();
+                String[] keyValue = pair.split(":");
+                if (keyValue.length == 2) {
+                    String key = keyValue[0].trim();
+                    String value = keyValue[1].trim();
+                    jsonBuilder.append("\"").append(key).append("\":").append(value).append(",");
+                }
             }
+            if (jsonBuilder.length() > 1) {
+                jsonBuilder.deleteCharAt(jsonBuilder.length() - 1);
+            }
+            jsonBuilder.append("}");
+            return jsonBuilder.toString();
         }
-        if (jsonBuilder.length() > 1) {
-            jsonBuilder.deleteCharAt(jsonBuilder.length() - 1);
-        }
-        jsonBuilder.append("}");
-        return jsonBuilder.toString();
+
+        return input;
     }
 
     public String outputResult() throws InvocationTargetException, IllegalAccessException, JsonProcessingException {
@@ -104,16 +110,17 @@
 
                 Object[] extraConvertedParams = new Object[inputVal.length];
                 boolean hasJson = false;
-                try{
+                try {
                     ObjectMapper objectMapper = new ObjectMapper();
-                    if(inputVal.length > 0 && inputVal[0].trim().startsWith("{")) {
-                        Map<String, Object> objectMap = objectMapper.readValue(convertToJson(inputVal[0]), new TypeReference<Map<String, Object>>() {
-                        });
-                        extraConvertedParams[0] = objectMap;
-                        if (inputVal.length >= 1) {
-                            System.arraycopy(inputVal, 1, extraConvertedParams, 1, inputVal.length - 1);
+                    for (int i = 0; i < inputVal.length; i++) {
+                        if (inputVal[i].trim().startsWith("{")) {
+                            Map<String, Object> objectMap = objectMapper.readValue(convertToJson(inputVal[i]), new TypeReference<Map<String, Object>>() {
+                            });
+                            extraConvertedParams[i] = objectMap;
+                            hasJson = true;
+                        } else {
+                            extraConvertedParams[i] = inputVal[i];
                         }
-                        hasJson = true;
                     }
                 } catch (Exception e) {
                     e.printStackTrace();
diff --git a/src/test/java/org/casbin/ClientTest.java b/src/test/java/org/casbin/ClientTest.java
index 751b027..86e73b0 100644
--- a/src/test/java/org/casbin/ClientTest.java
+++ b/src/test/java/org/casbin/ClientTest.java
@@ -323,6 +323,8 @@
     public void testABACRule() {
         assertEquals(Client.run(new String[]{"enforce", "-m", "examples/abac_rule_model.conf", "-p", "examples/abac_rule_policy.csv", "{Age: 30}", "/data1", "read"}), "{\"allow\":true,\"explain\":null}");
         assertEquals(Client.run(new String[]{"enforceEx", "-m", "examples/abac_rule_model.conf", "-p", "examples/abac_rule_policy.csv", "{Age: 30}", "/data1", "read"}), "{\"allow\":true,\"explain\":[\"r.sub.Age > 18 && r.sub.Age < 60\",\"/data1\",\"read\"]}");
+        assertEquals(Client.run(new String[]{"enforce", "-m", "examples/abac_model.conf", "-p", "examples/abac_policy.csv", "alice", "{ \"Owner\" : \"alice\" }"}), "{\"allow\":true,\"explain\":null}");
+        assertEquals(Client.run(new String[]{"enforceEx", "-m", "examples/abac_model.conf", "-p", "examples/abac_policy.csv", "alice", "{ \"Owner\" : \"alice\" }"}), "{\"allow\":true,\"explain\":[]}");
     }
 
     @Test