Использование json-lib для преобразования в java-вызовы ClassCastException - PullRequest
0 голосов
/ 14 мая 2011

Я использую 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)

Есть ли способ указатьтип класса значения карты в json-lib?

Большое спасибо за любую помощь.

Ответы [ 5 ]

1 голос
/ 20 декабря 2013

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);
1 голос
/ 24 апреля 2013

Как сказал chro:

Здесь говорится, что fromObject принимает строки в формате JSON, Maps, 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);
    }
1 голос
/ 20 июня 2011

Здесь говорится здесь , что fromObject принимает строки в формате JSON, Maps, DynaBeans и JavaBeans

0 голосов
/ 24 июня 2011

Есть ли способ указать тип класса значения карты в json-lib?

Нет.То же самое при десериализации до List<CustomType>, даже если вы сказали ему, какой тип вы хотите с помощью вызова toBean.

После вызова toBean значения в коллекции будут DynaBeans.Вы должны перебрать значения коллекции и преобразовать их в предпочтительные типы.Преобразование может быть выполнено вручную, поле за раз или более автоматическим способом с net.sf.ezmorph.Morpher, зарегистрированным в MorpherRegistry.

ВНИМАНИЕ: Даже при таком подходе вы должны быть осторожны скак вы ссылаетесь на значение перед его преобразованием в экземпляр целевого типа.Компилятор (и, следовательно, среда выполнения) считает, что значение имеет параметризованный тип (если используется обобщенный тип), и поэтому он с радостью попытается использовать его в качестве этого типа.Это, конечно, вызывает ClassCastException (даже если ваш код не выполняет явного приведения типов).Таким образом, при доступе к значениям просто получите их, объявив ссылку типа Object и используя ее.Не пытайтесь использовать значения любым другим способом без явной ссылки на тип Object.(Вы поймете, о чем я говорю, когда напишите код и увидите ошибки. Я сейчас слишком занят, чтобы кодировать пример.)

0 голосов
/ 14 мая 2011

Чтобы решить проблему раньше, отправьте весь свой код классов JsonConverterDemo, A и B. В частности, отсутствие объявления пакета, операторов импорта и номеров строк затрудняет определение проблемы.

...