Возможность задать отступ в jsonencode

This commit is contained in:
Victor 2019-05-29 19:11:53 +03:00
parent 23ed9e6d04
commit d3b5d9f059
2 changed files with 169 additions and 137 deletions

View File

@ -27,7 +27,7 @@ public final class ValueUtils {
}
}
public static Object toObject(MapValue map) {
public static JSONObject toObject(MapValue map) {
final JSONObject result = new JSONObject();
for (Map.Entry<Value, Value> entry : map) {
final String key = entry.getKey().asString();
@ -37,7 +37,7 @@ public final class ValueUtils {
return result;
}
public static Object toObject(ArrayValue array) {
public static JSONArray toObject(ArrayValue array) {
final JSONArray result = new JSONArray();
for (Value value : array) {
result.put(toObject(value));

View File

@ -1,25 +1,57 @@
package com.annimon.ownlang.modules.json;
import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.ArrayValue;
import com.annimon.ownlang.lib.Function;
import com.annimon.ownlang.lib.MapValue;
import com.annimon.ownlang.lib.StringValue;
import com.annimon.ownlang.lib.Types;
import com.annimon.ownlang.lib.Value;
import com.annimon.ownlang.lib.ValueUtils;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONWriter;
public final class json_encode implements Function {
@Override
public Value execute(Value... args) {
Arguments.check(1, args.length);
public Value execute(Value[] args) {
Arguments.checkOrOr(1, 2, args.length);
try {
final Object root = ValueUtils.toObject(args[0]);
final String jsonRaw = JSONObject.valueToString(root);
final int indent;
if (args.length == 2) {
indent = args[1].asInt();
} else {
indent = 0;
}
final String jsonRaw;
if (indent > 0) {
jsonRaw = format(args[0], indent);
} else {
final Object root = ValueUtils.toObject(args[0]);
jsonRaw = JSONWriter.valueToString(root);
}
return new StringValue(jsonRaw);
} catch (JSONException ex) {
throw new RuntimeException("Error while creating json", ex);
}
}
private String format(Value val, int indent) {
switch (val.type()) {
case Types.ARRAY:
return ValueUtils.toObject((ArrayValue) val).toString(indent);
case Types.MAP:
return ValueUtils.toObject((MapValue) val).toString(indent);
case Types.NUMBER:
return JSONWriter.valueToString(val.raw());
case Types.STRING:
return JSONWriter.valueToString(val.asString());
default:
return JSONWriter.valueToString(JSONObject.NULL);
}
}
}