Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
public class Student {
private int id;
public int getId() {
return this.id;
}
public setId(int newId) {
this.id = newId;
}
}
Приведенный ниже код дает вам исключение с нулевым указателем.
public class School {
Student obj_Student;
public School() {
try {
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
Поскольку вы используете Obj_Student
, но вы забыли инициализировать его, как в правильном коде, показанном ниже:
public class School {
Student obj_Student;
public School() {
try {
obj_Student = new Student();
obj_Student.setId(12);
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
Это хорошо известная проблема с стиранием типа Java: T - это просто переменная типа, и вы должны указать фактический класс, обычно как аргумент класса. Без такой информации лучшее, что можно сделать, это использовать границы; и простой T примерно такой же, как «T extends Object». Затем Джексон свяжет объекты JSON как Карты.
В этом случае метод тестера должен иметь доступ к классу, и вы можете построить
JavaType type = mapper.getTypeFactory().
constructCollectionType(List.class, Foo.class)
, а затем
List<Foo> list = mapper.readValue(new File("input.json"), type);
«JavaType» работает! Я пытался отменить сортировку (deserialize) List в json String в ArrayList java Objects и изо всех сил пытался найти решение с тех пор. Ниже приведен код, который, наконец, дал мне решение. Код:
JsonMarshallerUnmarshaller<T> {
T targetClass;
public ArrayList<T> unmarshal(String jsonString) {
ObjectMapper mapper = new ObjectMapper();
AnnotationIntrospector introspector = new JacksonAnnotationIntrospector();
mapper.getDeserializationConfig()
.withAnnotationIntrospector(introspector);
mapper.getSerializationConfig()
.withAnnotationIntrospector(introspector);
JavaType type = mapper.getTypeFactory().
constructCollectionType(
ArrayList.class,
targetclass.getClass());
try {
Class c1 = this.targetclass.getClass();
Class c2 = this.targetclass1.getClass();
ArrayList<T> temp = (ArrayList<T>)
mapper.readValue(jsonString, type);
return temp ;
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null ;
}
}
IOException
(требуется только один улов), а интроспектор аннотации по умолчанию уже JacksonAnnotationIntrospector
- поэтому не нужно ничего делать с ObjectMapper
, просто постройте его, и он работает.
– StaxMan
4 November 2015 в 18:34