正在解析 JSON 数组

Parsing JSON Array

我正在尝试打印公司列表。

我的JSON对象:

{
    "Name": "crunchify.com",
    "Author": "App Shah",
    "Company List": [
        "Compnay: eBay",
        "Compnay: Paypal",
        "Compnay: Google"
    ]
}

代码:

public class ProductTypeParser {

    public  void parseJson(JSONObject jsonObject) throws ParseException {



        JSONObject object = (JSONObject) jsonObject;
        String name = (String) object.get("Name");
        System.out.println(name);

        String age = (String) object.get("Author");
        System.out.println(age);

        //loop array        
        JSONArray msg = (JSONArray) object.get("Company List"); 
        Iterator<String> iterator = msg.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }       
    }
}

错误:

SEVERE: Servlet.service() for servlet [contextServlet] in context with path [/SpringSafeHouseService2.0] 
  threw exception [Request processing failed; nested exception is 
    java.lang.ClassCastException: java.util.ArrayList cannot be cast to org.json.simple.JSONArray] 
  with root cause java.lang.ClassCastException: java.util.ArrayList cannot be cast to org.json.simple.JSONArray

尝试 JSONArray msg = object.getJSONArray("Company List"); 而不是 JSONArray msg = (JSONArray) object.get("Company List");

投射到 ArrayList 而不是 JSONArray(因为可以是 JSONArray 或 ArrayList 或 List 的实现,这取决于你如何反序列化你的字符串,所以使用 ArrayList 或接口 List 确保你不能有 Class 抛出异常):

JSONObject parser = new JSONParser();
    JSONObject object = (JSONObject) parser.parse("{\n" +
            "    \"Name\": \"crunchify.com\",\n" +
            "    \"Author\": \"App Shah\",\n" +
            "    \"Company List\": [\n" +
            "        \"Compnay: eBay\",\n" +
            "        \"Compnay: Paypal\",\n" +
            "        \"Compnay: Google\"\n" +
            "    ]\n" +
            "}"); // Here there is a JSONArray for companies property

    Map<String, Object> obj = new HashMap();
    List<String> companies = new ArrayList<>();
    companies.add("a");
    companies.add("b");
    companies.add("c");
    obj.put("Name", "toto");
    obj.put("Author", "titi");
    obj.put("Company List", companies);
    JSONObject object2 = new JSONObject(obj); // here you have an ArrayList for companies property

    String name = (String) object.get("Name");
    System.out.println(name);

    String age = (String) object.get("Author");
    System.out.println(age);

    //loop array
    List msg = (List) object.get("Company List");
    Iterator<String> iterator = msg.iterator();
    while (iterator.hasNext()) {
        System.out.println(iterator.next());
    }

您正在使用具有不同界面的 org.json.simple

这是你如何迭代 ArrayList

 for(String s : object.get("Company List"))
      System.out.println(s);    

Json-simple(虽然缺少版本,但您似乎正在使用它,所以我的信息可能已过时)通常创建 JSONArray 的实例(扩展 ArrayList btw .) 对于 json 字符串中的数组,即您的 "Company List" 字段。

但是,您也可以传入一个不同的 ContainerFactory,这可能会为数组创建一个不同的 List 实例,因此这可能是您的演员表不起作用的原因(同样也有你的问题中的信息很少,无法进一步评论)。

最后,既然你应该得到一个 List,那么转换成那个应该是安全的:

List<?> msg = (List<?>) object.get("Company List");