在Java中解析JSON Map时出现NullPointer异常

时间:2019-01-07 19:46:10

标签: java json hashmap

我正在尝试从REST API中的下面的JSON解析productId,名称和价格-但是当我尝试让他获得name-String name = (String) obj.get("name");时,出现空指针异常,我可以知道我在做什么错吗?

任何帮助将不胜感激。 谢谢!

JSON:

{
    "id": "af0b86eb-046c-4400-8bc4-0e26042b8f53",
    "products": [{
            "productId": "1234",
            "name": "apple",
            "price": "383939"
        }
    ]
}

Controller.java

public ResponseEntity<Object> create(@RequestBody Map<String, Object> obj) {
    Product response = myservice.create(obj);
    return new ResponseEntity<Object>(response, HttpStatus.CREATED);
}

Service.java

public Product create(Map<String, Object> obj) { 
    for (Entry<String, Object> entry : obj.entrySet()) {
        System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
    }       

    Object [] products = (Object[]) obj.get("products");
    HashMap <String, Object> productOne = (HashMap) products[0];
    String productId = (String) productOne.get("name");
    System.out.println("productId: " +productId);

    String name = (String) obj.get("name");
    System.out.println("name: " +name);
}

输出:

Key : products Value : [{productId=1234, name=apple, price=383939}]

3 个答案:

答案 0 :(得分:5)

通过obj.get("name"),您尝试通过键name从json请求的顶层获取价值,而这是第二层对象的属性

在伪代码(跳过转换和空检查)中,它应如下所示: obj.get("products")[0].get("name")

答案 1 :(得分:2)

在Service.java中,在循环中打印 obj 。您的印刷品显示产品,值是一组对象。

因此,在下一行 obj 是该顶级对象,不包含“名称”字段。

String name = (String) obj.get("name");
System.out.println("name: " +name);

如果您调用obj.get(“products”)并尝试将其投射到集合中怎么办?然后尝试从集合中获取第一个索引。它应该包含内部对象,该内部对象包含名称键和值。

答案 2 :(得分:1)

您应该按深度(或级别)完全按照您看到的json进行推理。

最初,整个json包含在obj映射中,该映射包含两个键值对:

(key = "id", value = "af0b86eb-046c-4400-8bc4-0e26042b8f53")
(key = "products", value = [{"productId": "1234", "name": "apple", "price": "383939"}])

由于您对产品的详细信息感兴趣,因此第一步是这样提取数组products,如下所示:

Object [] products = obj.get("products");

现在乘积是一个对象数组。由于您知道对象依次是哈希映射,因此可以将每个对象投射到映射并访问所需的键:

HashMap <String, Object> productOne = (HashMap) products[0];
String productId = (String) productOne.get("productId");
String name = (String) productOne.get("name");
..