为什么我会得到这个错误;无法将java.lang.String转换为java.util.List;使用以下代码段?

为什么我会得到这个错误;无法将java.lang.String转换为java.util.List;使用以下代码段?,java,json,string,arraylist,classcastexception,Java,Json,String,Arraylist,Classcastexception,下面是一个示例代码段,我试图通过在执行此操作时获取类强制转换异常来从json对象获取数组列表 public static void main(String args[]) throws Exception { List<String> arrayList = new ArrayList<String>(); arrayList.add("a"); arrayList.add("b"); arrayList.add("c"); arr

下面是一个示例代码段,我试图通过在执行此操作时获取类强制转换异常来从json对象获取数组列表

public static void main(String args[]) throws Exception {
    List<String> arrayList = new ArrayList<String>();
    arrayList.add("a");
    arrayList.add("b");
    arrayList.add("c");
    arrayList.add("d");
    arrayList.add("e");
    JSONObject json = new JSONObject();
    json.put("raja", "suba");
    json.put("arraylist", arrayList);
    System.out.println("Thus the value of array list is : "+json.get("arraylist"));
    List<String> oldlist = (List<String>) json.get("arraylist");
    System.out.println("Old list contains : "+oldlist);
    System.out.println("The old json contains : "+json.toString());
    String result = json.toString();
    JSONObject json1 = new JSONObject(result);
    System.out.println("The new json value is  : " +json1);
    System.out.println("The value in json for raja is  :" +json1.get("raja"));
    System.out.println("The vlaue of array list is  : "+json1.get("arraylist"));
    List<String> newlist = (List<String>) json1.get("arraylist");
    System.out.println("Thus the value of new list contains : "+newlist);
}
publicstaticvoidmain(字符串args[])引发异常{
List arrayList=新建arrayList();
arrayList.添加(“a”);
arrayList.添加(“b”);
arrayList.添加(“c”);
arrayList.添加(“d”);
arrayList.添加(“e”);
JSONObject json=新的JSONObject();
json.put(“raja”、“suba”);
put(“arraylist”,arraylist);
System.out.println(“因此数组列表的值是:”+json.get(“arraylist”));
List oldlist=(List)json.get(“arraylist”);
System.out.println(“旧列表包含:“+oldlist”);
System.out.println(“旧json包含:“+json.toString()”);
字符串结果=json.toString();
JSONObject json1=新的JSONObject(结果);
System.out.println(“新的json值为:“+json1”);
System.out.println(“raja的json值为:”+json1.get(“raja”));
System.out.println(“数组列表的值是:”+json1.get(“arraylist”));
List newlist=(List)json1.get(“arraylist”);
System.out.println(“因此,新列表的值包含:“+newlist”);
}
我在获取
oldlist
时没有遇到异常,但在获取
newlist
时遇到了类强制转换异常

  • 为什么数组列表在第一种情况下被视为对象,而在第二种情况下被视为字符串
  • json.toString()真正做什么?它是将整个json对象转换为字符串,就像将双引号“”附加到整个json对象一样,还是将其中的每个对象都转换为字符串

  • 这里的问题是当你这样做的时候

    json.put("arraylist", arrayList);
    
    您明确要求列表序列化。这意味着将执行底层逻辑,以便将与类相关的元数据保存到JSONObject中。但是,当您执行json.toString()时,此元数据将丢失,最终会得到一个旧的普通字符串对象。然后,当您尝试在运行时反序列化该字符串时,会得到一个ClassCastException,因为它不知道如何将该字符串转换为列表


    为了回答第二个问题,JSONObject.toString()以JSON格式返回对象的字符串表示形式。这意味着,如果您有一个ArrayList,而不是一个带有ArrayList.toString()值的字段,那么您将有一个带有列表值的数组元素。

    您必须找到一种方法,根据键
    ArrayList
    来告诉
    json
    值的类型。您的意思是我们应该得到像“getString”、“getLong”这样的数组列表像这样的。。。是这样吗@santosh patil?如果您的目的是从jsonobject获取列表,那么请使用以下代码:JSONArray oldlist=json.getJSONArray(“arraylist”);System.out.println(“旧列表包含:“+oldlist”);由于数组列表不是JSONArray-尝试以json数组的形式获取它将再次导致错误..感谢您的回复@Aurasphere。我无法理解您的观点“您明确要求列表序列化。这意味着将执行底层逻辑,以便将与类相关的元数据保存到JSONObject中”。你能给我解释一下吗?我不明白重点-什么元数据与类相关将保存在这里-它将如何帮助序列化和反序列化?当然。当您序列化一个类时,无论您使用何种格式(XML、JSON…),您基本上都会获取一个java对象并将其转换为字符串。当您执行相反的操作时,您将获取该字符串并将其转换回对象的实例。关键是:反序列化器类如何知道为JSON字段选择哪个类?当JSON本身是Java对象(JSONObject的情况)时,可以将此信息存储到Java对象中。但是你会把它存储在哪里呢?一些框架,比如谷歌的GSON可以做到这一点,但它不是内置在JSONObject中的。非常感谢@Aurasphere。你解释得很清楚-帮助我理解我的问题:-)很高兴听到你这么说D