aQute.lib.json.ObjectHandler Maven / Gradle / Ivy
package aQute.lib.json;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class ObjectHandler extends Handler {
@SuppressWarnings("rawtypes")
final Class rawClass;
final Field fields[];
final Type types[];
final Object defaults[];
final Field extra;
ObjectHandler(JSONCodec codec, Class> c) throws Exception {
rawClass = c;
List fields = new ArrayList<>();
for (Field f : c.getFields()) {
if (Modifier.isStatic(f.getModifiers()))
continue;
fields.add(f);
}
this.fields = fields.toArray(new Field[0]);
// Sort the fields so the output is canonical
Arrays.sort(this.fields, (o1, o2) -> o1.getName()
.compareTo(o2.getName()));
types = new Type[this.fields.length];
defaults = new Object[this.fields.length];
Field x = null;
for (int i = 0; i < this.fields.length; i++) {
if (this.fields[i].getName()
.equals("__extra"))
x = this.fields[i];
types[i] = this.fields[i].getGenericType();
}
if (x != null && Map.class.isAssignableFrom(x.getType()))
extra = x;
else
extra = null;
try {
Object template = newInstance(c);
for (int i = 0; i < this.fields.length; i++) {
defaults[i] = getField(this.fields[i], template);
}
} catch (Exception e) {
// Ignore
}
}
@Override
public void encode(Encoder app, Object object, Map