Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用json库转换为java引发ClassCastException_Java_Json_Json Lib - Fatal编程技术网

使用json库转换为java引发ClassCastException

使用json库转换为java引发ClassCastException,java,json,json-lib,Java,Json,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 = ne

我正在使用它将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;
    }
}
公共类JSONConvertorOrdemo{
公共静态void main(字符串[]args){
B b1=新的B(“b1”);
Map bMap=新的HashMap();
bMap.put(“键1”,b1);
a1=新的A(bMap);
JSONObject JSONObject=JSONObject.fromObject(a1);
字符串json=jsonObject.toString();
jsonObject=jsonObject.fromObject(json);
Map classMap=newhashmap();
classMap.put(“bMap”,Map.class);
a1=(A)JSONObject.toBean(JSONObject,A.class,classMap);
bMap=a1.getbMap();
System.out.println(bMap.get(“key1”).getB1());
}
}
公共A类{
私有映射bMap=newhashmap();
公共A(){}
公共A(地图bMap){
this.bMap=bMap;
}
公共地图getbMap(){
返回bMap;
}
公共地图(地图bMap){
this.bMap=bMap;
}
}
公共B级{
专用字符串b1;
公共B(){}
公共B(字符串b1){
这1.b1=b1;
}
公共字符串getB1(){
返回b1;
}
公共空间1(字符串b1){
这1.b1=b1;
}
}
它引发以下异常:

线程“main”java.lang.ClassCastException中的异常:
net.sf.ezmorp.bean.MorphDynaBean不能强制转换为code.orgexample.json.B
位于code.orgexample.json.JsonConvertorDemo.main(JsonConvertorDemo.java:30)

有没有办法在json库中指定映射值的类类型


非常感谢您的帮助。

为了更快地解决问题,请提交您所有的JsonConverterDemo、A和B类代码。
特别是,由于缺少包声明、导入语句和行号,无法确定问题所在。

要尽快解决问题,请提交您所有的JsonConverterDemo、A和B类代码。 特别是,缺少包声明、导入语句和行号阻碍了确定问题所在。

据说fromObject接受JSON格式的字符串、映射、DynaBeans和JavaBeans

据说fromObject接受JSON格式的字符串、映射、DynaBeans和JavaBeans

有没有办法在json库中指定映射值的类类型

没有。反序列化到
列表
时也是如此,即使您通过
toBean
调用告诉它您想要什么类型

调用
toBean
后,集合中的值将为
DynaBeans
。您必须遍历集合值并将它们变形为首选类型。变形可以手动完成,一次一个字段,或者使用注册在
MorpherRegistry
中的
net.sf.ezmorph.Morpher
以更自动的方式完成

警告:即使使用这种方法,在将值变形为目标类型的实例之前,也必须小心如何引用该值。编译器(以及运行时)认为该值属于参数化类型(如果使用泛型),因此它会乐意尝试将其用作该类型。这当然会导致ClassCastException(即使您的代码没有执行任何显式类型转换)。因此,在访问这些值时,只需声明一个类型为
Object
的引用并使用它即可访问它们。如果没有显式的
对象
类型引用,请不要尝试以任何其他方式使用这些值。(当您编写代码并看到错误时,您就会知道我在说什么。我现在太忙了,无法编写示例。)

有没有办法在json库中指定映射值的类类型

没有。反序列化到
列表
时也是如此,即使您通过
toBean
调用告诉它您想要什么类型

调用
toBean
后,集合中的值将为
DynaBeans
。您必须遍历集合值并将它们变形为首选类型。变形可以手动完成,一次一个字段,或者使用注册在
MorpherRegistry
中的
net.sf.ezmorph.Morpher
以更自动的方式完成

警告:即使使用这种方法,在将值变形为目标类型的实例之前,也必须小心如何引用该值。编译器(以及运行时)认为该值属于参数化类型(如果使用泛型),因此它会乐意尝试将其用作该类型。这当然会导致ClassCastException(即使您的代码没有执行任何显式类型转换)。因此,在访问这些值时,只需声明一个类型为
Object
的引用并使用它即可访问它们。如果没有显式的
对象
类型引用,请不要尝试以任何其他方式使用这些值。(当您编写代码并看到错误时,您就会知道我在说什么。我现在太忙了,无法编写示例。)

正如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);
    }
正如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);
    }

JsonConfig JsonConfig=new JsonConfig();
jsonConfig.setRootClass(Class2.class);
Map classMap=newhashmap();
classMap.put(“学生”,Student.class);//指定JsonrCrequest的要求字段的内部类型
jsonConfig.setClassMap(classMap);

JsonConfig JsonConfig=new JsonConfig();
jsonConfig.setRootClass(Class2.class);
Map classMap=newhashmap();
classMap.put(“学生”,Student.class);//指定JsonrCrequest的要求字段的内部类型
jsonConfig.setClassMap(