package aQute.lib.json;
import java.io.IOException;
import java.lang.reflect.Array;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Map;
import aQute.lib.hex.Hex;
public class ArrayHandler extends Handler {
Type componentType;
ArrayHandler(@SuppressWarnings("unused") Class< ? > rawClass, Type componentType) {
this.componentType = componentType;
}
@Override
public void encode(Encoder app, Object object, Map<Object,Type> visited) throws IOException, Exception {
// Byte arrays should not be treated as arrays. We treat them
// as hex strings
if (object instanceof byte[]) {
StringHandler.string(app, Hex.toHexString((byte[]) object));
return;
}
app.append("[");
app.indent();
String del = "";
int l = Array.getLength(object);
for (int i = 0; i < l; i++)
try {
app.append(del);
app.encode(Array.get(object, i), componentType, visited);
del = ",";
} catch (Exception e) {
throw new IllegalArgumentException("[" + i + "]", e);
}
app.undent();
app.append("]");
}
@Override
public Object decodeArray(Decoder r) throws Exception {
ArrayList<Object> list = new ArrayList<Object>();
r.codec.parseArray(list, componentType, r);
Object array = Array.newInstance(r.codec.getRawClass(componentType), list.size());
int n = 0;
for (Object o : list)
Array.set(array, n++, o);
return array;
}
}