【问题标题】:NullPointer exception while parsing JSON Map in java在 java 中解析 JSON Map 时出现 NullPointer 异常
【发布时间】:2019-06-02 11:56:35
【问题描述】:

我正在尝试从 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}]

【问题讨论】:

  • 您似乎在 obj 实例上获得了 NPE,请确保它已正确连接到您的服务中
  • 其接线正确,我可以打印 obj 值

标签: java json hashmap


【解决方案1】:

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

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

【讨论】:

  • oh..如何获取二级对象:(
  • 我试过这种方法 obj.get("products")[0].get("name") 但Java不喜欢这种语法
【解决方案2】:

在 Service.java 中,您在 for 循环中打印 obj。您的印刷品说 keyproducts 而 value 是一个对象数组。

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

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

如果您调用obj.get(“products”) 并尝试将其转换为集合会怎样?然后尝试从集合中获取第一个索引。它应该包含包含 name 键和值的内部对象。

【讨论】:

  • 我试过了 - Map testobj = (Map) obj.get("products"); System.out.println("值为:" +testobj.get("name"));但我得到了这个异常原因:java.lang.ClassCastException: java.util.ArrayList incompatible with java.util.Map
  • 检查下面的@NiVeR 答案。
  • 我试过但得到了同样的异常 - 不知道为什么它不起作用
  • 我自己很难重现这个问题,但看看那个异常。看起来 object 不能只转换为 Map 因为 obj.get("products") 似乎返回 List 类型。
  • 所以你应该把它转换成 List 或 ArrayList。你在这里使用像 Spring 这样的 Web 框架吗?
【解决方案3】:

你应该按照你看到的 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");

现在 product 是一个对象数组。由于您知道您的对象又是哈希映射,您可以将每个对象转换为映射并访问您想要的键:

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

【讨论】:

  • 我试过这个但是得到这个异常原因:java.lang.ClassCastException: java.util.ArrayList incompatible with [Ljava.lang.Object;更新原帖中的代码。
猜你喜欢
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多