#java #json #json-lib
#java #json #json-lib
Вопрос:
Я использую json-lib для преобразования объекта json в java. Приведенный ниже код:
public class JsonConvertorDemo {
public static void main(String[] args) {
B b1 = new B("b1");
Map<String, B> bMap = new HashMap<String, B>();
bMap.put("key1", b1);
A a1 = new A(bMap);
JSONObject jsonObject = JSONObject.fromObject(a1);
String json = jsonObject.toString();
jsonObject = JSONObject.fromObject(json);
Map<String, Class> classMap = new HashMap<String, Class>();
classMap.put("bMap", Map.class);
a1 = (A) JSONObject.toBean(jsonObject, A.class, classMap);
bMap = a1.getbMap();
System.out.println(bMap.get("key1").getB1());
}
}
public class A {
private Map<String, B> bMap = new HashMap<String, B>();
public A() {}
public A(Map<String, B> bMap) {
this.bMap = bMap;
}
public Map<String, B> getbMap() {
return bMap;
}
public void setbMap(Map<String, B> bMap) {
this.bMap = bMap;
}
}
public class B {
private String b1;
public B() {}
public B(String b1) {
this.b1 = b1;
}
public String getB1() {
return b1;
}
public void setB1(String b1) {
this.b1 = b1;
}
}
Это вызывает следующее исключение:
Исключение в потоке «main» java.lang.ClassCastException:
net.sf.ezmorph.bean.MorphDynaBean не может быть преобразован в code.orgexample.json.B
в code.orgexample.json.JsonConvertorDemo.main(JsonConvertorDemo.java:30)
Есть ли способ указать тип класса значения map в json-lib?
Большое спасибо за любую помощь.
Ответ №1:
Здесь говорится, что fromObject принимает строки в формате JSON, карты, DynaBeans и JavaBeans
Ответ №2:
Как сказал chro:
Здесь говорится, что fromObject принимает строки в формате JSON, карты, DynaBeans и JavaBeans
В моем коде ClassCastException было вызвано:
for (TheClass childNode : command.getChildren()) {
При изменении кода на следующий все работало так, как ожидалось:
for (Object childNode : command.getChildren()) {
JSONObject fromObject = JSONObject.fromObject(childNode);
TheClass childCommand = (TheClass) JSONObject.toBean(fromObject,
TheClass.class);
}
Ответ №3:
http://hw1287789687.iteye.com/admin/blogs/1993048
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.setRootClass(Class2.class);
Map<String, Class> classMap = new HashMap<String, Class>();
classMap.put("students", Student.class); // 指定JsonRpcRequest的request字段的内部类型
jsonConfig.setClassMap(classMap);
Ответ №4:
Чтобы решить проблему быстрее, пожалуйста, отправьте весь ваш код классов JsonConverterDemo, A и B. В частности, отсутствие объявления пакета, инструкций импорта и номеров строк затрудняет определение того, в чем проблема.
Ответ №5:
Есть ли способ указать тип класса значения map в json-lib?
Нет. То же самое при десериализации в List<CustomType>
, даже если вы указали ему, какой тип вы хотите с toBean
вызовом.
После вызова toBean
значения в коллекции будут DynaBeans
. Вы должны выполнить итерацию по значениям коллекции и преобразовать их в предпочтительные типы. Преобразование может быть выполнено вручную, по полю за раз, или более автоматическим способом с помощью net.sf.ezmorph.Morpher
зарегистрированного в MorpherRegistry
.
ПРЕДУПРЕЖДЕНИЕ: Даже при таком подходе вы должны быть осторожны с тем, как вы ссылаетесь на значение, прежде чем преобразовать его в экземпляр целевого типа. Компилятор (и, следовательно, среда выполнения) считает, что значение имеет параметризованный тип (если используются общие), и поэтому он с удовольствием попытается использовать его в качестве этого типа. Это, конечно, вызывает ClassCastException (даже если ваш код не выполняет никакого явного приведения типов). Итак, при доступе к значениям просто переходите к ним, объявляя ссылку типа Object
и используя ее. Не пытайтесь использовать значения каким-либо другим способом без явной Object
ссылки на тип. (Вы поймете, о чем я говорю, когда напишете код и увидите ошибки. Я слишком занят, чтобы прямо сейчас написать пример.)