Made JSONObjectInputStream more robust

This commit is contained in:
Ziver Koc 2021-08-29 01:02:47 +02:00
parent 805ee6afc5
commit 12b0fb219e

View file

@ -30,10 +30,7 @@ import zutil.parser.Base64Decoder;
import zutil.parser.DataNode; import zutil.parser.DataNode;
import java.io.*; import java.io.*;
import java.lang.reflect.Array; import java.lang.reflect.*;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import java.util.*; import java.util.*;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -241,30 +238,38 @@ public class JSONObjectInputStream extends InputStream implements ObjectInput, C
// Date and time objects // Date and time objects
if (Date.class.isAssignableFrom(objClass)) { if (Date.class.isAssignableFrom(objClass)) {
obj = new Date(json.getLong("timestamp")); if (json.getString("timestamp") != null) {
obj = new Date(json.getLong("timestamp"));
}
} }
else if (Calendar.class.isAssignableFrom(objClass)) { else if (Calendar.class.isAssignableFrom(objClass)) {
obj = Calendar.getInstance(); if (json.getString("timestamp") != null) {
((Calendar) obj).setTimeInMillis(json.getLong("timestamp")); obj = Calendar.getInstance();
((Calendar) obj).setTimeInMillis(json.getLong("timestamp"));
}
} }
// Instantiate generic object // Instantiate generic object
else{ else{
obj = objClass.getDeclaredConstructor().newInstance(); try {
obj = objClass.getDeclaredConstructor().newInstance();
// Read all fields from the new object instance // Read all fields from the new object instance
for (Field field : ClassUtil.getAllDeclaredFields(obj.getClass())) { for (Field field : ClassUtil.getAllDeclaredFields(obj.getClass())) {
if ((field.getModifiers() & Modifier.STATIC) == 0 && if ((field.getModifiers() & Modifier.STATIC) == 0 &&
(field.getModifiers() & Modifier.TRANSIENT) == 0 && (field.getModifiers() & Modifier.TRANSIENT) == 0 &&
json.get(field.getName()) != null) { json.get(field.getName()) != null) {
// Parse field // Parse field
field.setAccessible(true); field.setAccessible(true);
field.set(obj, readType( field.set(obj, readType(
field.getType(), field.getType(),
ClassUtil.getGenericClasses(field), ClassUtil.getGenericClasses(field),
field.get(obj), field.get(obj),
field.getName(), field.getName(),
json.get(field.getName()))); json.get(field.getName())));
}
} }
} catch (Exception e) {
logger.warning("Unable to instantiate object(" + key + "): " + e.getMessage());
} }
} }
// Add object to the cache // Add object to the cache