Skip to content

Commit d3b5d9f

Browse files
committed
Возможность задать отступ в jsonencode
1 parent 23ed9e6 commit d3b5d9f

File tree

2 files changed

+169
-137
lines changed

2 files changed

+169
-137
lines changed
Lines changed: 133 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -1,133 +1,133 @@
1-
package com.annimon.ownlang.lib;
2-
3-
import com.annimon.ownlang.exceptions.TypeException;
4-
import java.lang.reflect.Field;
5-
import java.lang.reflect.Modifier;
6-
import java.util.Iterator;
7-
import java.util.Map;
8-
import org.json.JSONArray;
9-
import org.json.JSONObject;
10-
11-
public final class ValueUtils {
12-
13-
private ValueUtils() { }
14-
15-
public static Object toObject(Value val) {
16-
switch (val.type()) {
17-
case Types.ARRAY:
18-
return toObject((ArrayValue) val);
19-
case Types.MAP:
20-
return toObject((MapValue) val);
21-
case Types.NUMBER:
22-
return val.raw();
23-
case Types.STRING:
24-
return val.asString();
25-
default:
26-
return JSONObject.NULL;
27-
}
28-
}
29-
30-
public static Object toObject(MapValue map) {
31-
final JSONObject result = new JSONObject();
32-
for (Map.Entry<Value, Value> entry : map) {
33-
final String key = entry.getKey().asString();
34-
final Object value = toObject(entry.getValue());
35-
result.put(key, value);
36-
}
37-
return result;
38-
}
39-
40-
public static Object toObject(ArrayValue array) {
41-
final JSONArray result = new JSONArray();
42-
for (Value value : array) {
43-
result.put(toObject(value));
44-
}
45-
return result;
46-
}
47-
48-
public static Value toValue(Object obj) {
49-
if (obj instanceof JSONObject) {
50-
return toValue((JSONObject) obj);
51-
}
52-
if (obj instanceof JSONArray) {
53-
return toValue((JSONArray) obj);
54-
}
55-
if (obj instanceof String) {
56-
return new StringValue((String) obj);
57-
}
58-
if (obj instanceof Number) {
59-
return NumberValue.of(((Number) obj));
60-
}
61-
if (obj instanceof Boolean) {
62-
return NumberValue.fromBoolean((Boolean) obj);
63-
}
64-
// NULL or other
65-
return NumberValue.ZERO;
66-
}
67-
68-
public static MapValue toValue(JSONObject json) {
69-
final MapValue result = new MapValue(json.length());
70-
final Iterator<String> it = json.keys();
71-
while(it.hasNext()) {
72-
final String key = it.next();
73-
final Value value = toValue(json.get(key));
74-
result.set(new StringValue(key), value);
75-
}
76-
return result;
77-
}
78-
79-
public static ArrayValue toValue(JSONArray json) {
80-
final int length = json.length();
81-
final ArrayValue result = new ArrayValue(length);
82-
for (int i = 0; i < length; i++) {
83-
final Value value = toValue(json.get(i));
84-
result.set(i, value);
85-
}
86-
return result;
87-
}
88-
89-
public static Number getNumber(Value value) {
90-
if (value.type() == Types.NUMBER) return ((NumberValue) value).raw();
91-
return value.asInt();
92-
}
93-
94-
public static float getFloatNumber(Value value) {
95-
if (value.type() == Types.NUMBER) return ((NumberValue) value).raw().floatValue();
96-
return (float) value.asNumber();
97-
}
98-
99-
public static byte[] toByteArray(ArrayValue array) {
100-
final int size = array.size();
101-
final byte[] result = new byte[size];
102-
for (int i = 0; i < size; i++) {
103-
result[i] = (byte) array.get(i).asInt();
104-
}
105-
return result;
106-
}
107-
108-
public static Function consumeFunction(Value value, int argumentNumber) {
109-
return consumeFunction(value, " at argument " + (argumentNumber + 1));
110-
}
111-
112-
public static Function consumeFunction(Value value, String errorMessage) {
113-
final int type = value.type();
114-
if (type != Types.FUNCTION) {
115-
throw new TypeException("Function expected" + errorMessage
116-
+ ", but found " + Types.typeToString(type));
117-
}
118-
return ((FunctionValue) value).getValue();
119-
}
120-
121-
public static <T extends Number> MapValue collectNumberConstants(Class<?> clazz, Class<T> type) {
122-
MapValue result = new MapValue(20);
123-
for (Field field : clazz.getDeclaredFields()) {
124-
if (!Modifier.isStatic(field.getModifiers())) continue;
125-
if (!field.getType().equals(type)) continue;
126-
try {
127-
result.set(field.getName(), NumberValue.of((T) field.get(type)));
128-
} catch (IllegalAccessException ignore) {
129-
}
130-
}
131-
return result;
132-
}
133-
}
1+
package com.annimon.ownlang.lib;
2+
3+
import com.annimon.ownlang.exceptions.TypeException;
4+
import java.lang.reflect.Field;
5+
import java.lang.reflect.Modifier;
6+
import java.util.Iterator;
7+
import java.util.Map;
8+
import org.json.JSONArray;
9+
import org.json.JSONObject;
10+
11+
public final class ValueUtils {
12+
13+
private ValueUtils() { }
14+
15+
public static Object toObject(Value val) {
16+
switch (val.type()) {
17+
case Types.ARRAY:
18+
return toObject((ArrayValue) val);
19+
case Types.MAP:
20+
return toObject((MapValue) val);
21+
case Types.NUMBER:
22+
return val.raw();
23+
case Types.STRING:
24+
return val.asString();
25+
default:
26+
return JSONObject.NULL;
27+
}
28+
}
29+
30+
public static JSONObject toObject(MapValue map) {
31+
final JSONObject result = new JSONObject();
32+
for (Map.Entry<Value, Value> entry : map) {
33+
final String key = entry.getKey().asString();
34+
final Object value = toObject(entry.getValue());
35+
result.put(key, value);
36+
}
37+
return result;
38+
}
39+
40+
public static JSONArray toObject(ArrayValue array) {
41+
final JSONArray result = new JSONArray();
42+
for (Value value : array) {
43+
result.put(toObject(value));
44+
}
45+
return result;
46+
}
47+
48+
public static Value toValue(Object obj) {
49+
if (obj instanceof JSONObject) {
50+
return toValue((JSONObject) obj);
51+
}
52+
if (obj instanceof JSONArray) {
53+
return toValue((JSONArray) obj);
54+
}
55+
if (obj instanceof String) {
56+
return new StringValue((String) obj);
57+
}
58+
if (obj instanceof Number) {
59+
return NumberValue.of(((Number) obj));
60+
}
61+
if (obj instanceof Boolean) {
62+
return NumberValue.fromBoolean((Boolean) obj);
63+
}
64+
// NULL or other
65+
return NumberValue.ZERO;
66+
}
67+
68+
public static MapValue toValue(JSONObject json) {
69+
final MapValue result = new MapValue(json.length());
70+
final Iterator<String> it = json.keys();
71+
while(it.hasNext()) {
72+
final String key = it.next();
73+
final Value value = toValue(json.get(key));
74+
result.set(new StringValue(key), value);
75+
}
76+
return result;
77+
}
78+
79+
public static ArrayValue toValue(JSONArray json) {
80+
final int length = json.length();
81+
final ArrayValue result = new ArrayValue(length);
82+
for (int i = 0; i < length; i++) {
83+
final Value value = toValue(json.get(i));
84+
result.set(i, value);
85+
}
86+
return result;
87+
}
88+
89+
public static Number getNumber(Value value) {
90+
if (value.type() == Types.NUMBER) return ((NumberValue) value).raw();
91+
return value.asInt();
92+
}
93+
94+
public static float getFloatNumber(Value value) {
95+
if (value.type() == Types.NUMBER) return ((NumberValue) value).raw().floatValue();
96+
return (float) value.asNumber();
97+
}
98+
99+
public static byte[] toByteArray(ArrayValue array) {
100+
final int size = array.size();
101+
final byte[] result = new byte[size];
102+
for (int i = 0; i < size; i++) {
103+
result[i] = (byte) array.get(i).asInt();
104+
}
105+
return result;
106+
}
107+
108+
public static Function consumeFunction(Value value, int argumentNumber) {
109+
return consumeFunction(value, " at argument " + (argumentNumber + 1));
110+
}
111+
112+
public static Function consumeFunction(Value value, String errorMessage) {
113+
final int type = value.type();
114+
if (type != Types.FUNCTION) {
115+
throw new TypeException("Function expected" + errorMessage
116+
+ ", but found " + Types.typeToString(type));
117+
}
118+
return ((FunctionValue) value).getValue();
119+
}
120+
121+
public static <T extends Number> MapValue collectNumberConstants(Class<?> clazz, Class<T> type) {
122+
MapValue result = new MapValue(20);
123+
for (Field field : clazz.getDeclaredFields()) {
124+
if (!Modifier.isStatic(field.getModifiers())) continue;
125+
if (!field.getType().equals(type)) continue;
126+
try {
127+
result.set(field.getName(), NumberValue.of((T) field.get(type)));
128+
} catch (IllegalAccessException ignore) {
129+
}
130+
}
131+
return result;
132+
}
133+
}
Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,57 @@
11
package com.annimon.ownlang.modules.json;
22

33
import com.annimon.ownlang.lib.Arguments;
4+
import com.annimon.ownlang.lib.ArrayValue;
45
import com.annimon.ownlang.lib.Function;
6+
import com.annimon.ownlang.lib.MapValue;
57
import com.annimon.ownlang.lib.StringValue;
8+
import com.annimon.ownlang.lib.Types;
69
import com.annimon.ownlang.lib.Value;
710
import com.annimon.ownlang.lib.ValueUtils;
811
import org.json.JSONException;
912
import org.json.JSONObject;
13+
import org.json.JSONWriter;
1014

1115

1216
public final class json_encode implements Function {
1317

1418
@Override
15-
public Value execute(Value... args) {
16-
Arguments.check(1, args.length);
19+
public Value execute(Value[] args) {
20+
Arguments.checkOrOr(1, 2, args.length);
1721
try {
18-
final Object root = ValueUtils.toObject(args[0]);
19-
final String jsonRaw = JSONObject.valueToString(root);
22+
final int indent;
23+
if (args.length == 2) {
24+
indent = args[1].asInt();
25+
} else {
26+
indent = 0;
27+
}
28+
29+
final String jsonRaw;
30+
if (indent > 0) {
31+
jsonRaw = format(args[0], indent);
32+
} else {
33+
final Object root = ValueUtils.toObject(args[0]);
34+
jsonRaw = JSONWriter.valueToString(root);
35+
}
2036
return new StringValue(jsonRaw);
37+
2138
} catch (JSONException ex) {
2239
throw new RuntimeException("Error while creating json", ex);
2340
}
2441
}
42+
43+
private String format(Value val, int indent) {
44+
switch (val.type()) {
45+
case Types.ARRAY:
46+
return ValueUtils.toObject((ArrayValue) val).toString(indent);
47+
case Types.MAP:
48+
return ValueUtils.toObject((MapValue) val).toString(indent);
49+
case Types.NUMBER:
50+
return JSONWriter.valueToString(val.raw());
51+
case Types.STRING:
52+
return JSONWriter.valueToString(val.asString());
53+
default:
54+
return JSONWriter.valueToString(JSONObject.NULL);
55+
}
56+
}
2557
}

0 commit comments

Comments
 (0)