Исключение NullPointer при разборе карты JSON в Java - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь проанализировать productId, name и price из моего ниже JSON в REST API - но я получаю исключение нулевого указателя, когда пытаюсь получить его 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 голосов
/ 07 января 2019

В Service.java вы печатаете obj внутри для цикла. В вашей печати написано, что ключ - это продуктов , а значение - это массив объектов.

Итак, в следующей строке obj - это объект верхнего уровня, не содержащий поля «name».

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

Что, если вы позвоните obj.get(“products”) и попытаетесь разложить его в коллекцию? Затем пытаемся получить первый индекс из коллекции. Он должен содержать внутренний объект, который содержит имя ключ и значение.

0 голосов
/ 07 января 2019

Вы должны рассуждать точно так же, как вы видите 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");
..
0 голосов
/ 07 января 2019

По obj.get("name") вы пытаетесь получить значение по ключу name из верхнего уровня вашего запроса json, в то время как это свойство объекта второго уровня

В псевдокоде (пропуская приведение и нулевые проверки) это должно выглядеть так: obj.get("products")[0].get("name")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...