Подтвердить что ты не робот

Преобразование Java String в JSON

Я получаю данные из restful api в переменной String, теперь я хочу преобразовать объект JSON, но у меня проблема, в то время как преобразование вызывает исключение. Вот мой код:

URL url = new URL("SOME URL");

HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");

BufferedReader br = new BufferedReader(new InputStreamReader(
        (conn.getInputStream())));

String output;
System.out.println("Output from Server .... \n");
while ((output = br.readLine()) != null) {
    System.out.println(output);
}

conn.disconnect();


JSONObject jObject  = new JSONObject(output);
String projecname=(String) jObject.get("name");
System.out.print(projecname);

В моей строке содержится

 {"data":{"name":"New Product","id":1,"description":"","is_active":true,"parent":{"id":0,"name":"All Projects"}}}

это строка, которую я хочу в json, но она показывает мне Исключение в потоке "main"

java.lang.NullPointerException
    at java.io.StringReader.<init>(Unknown Source)
    at org.json.JSONTokener.<init>(JSONTokener.java:83)
    at org.json.JSONObject.<init>(JSONObject.java:310)
    at Main.main(Main.java:37)
4b9b3361

Ответ 1

name присутствует внутри data. Вам нужно проанализировать JSON иерархически, чтобы иметь возможность правильно получать данные.

JSONObject jObject  = new JSONObject(output); // json
JSONObject data = jObject.getJSONObject("data"); // get data object
String projectname = data.getString("name"); // get the name from data.

Примечание. В этом примере используется класс org.json.JSONObject, а не org.json.simple.JSONObject.


Как "Matthew" упоминает в комментариях, что он использует org.json.simple.JSONObject, я добавляю свои комментарии в ответ.

Попробуйте вместо этого использовать org.json.JSONObject. Но если вы не можете изменить свою библиотеку JSON, вы можете ссылаться на этот пример, который использует ту же библиотеку, что и ваша, и проверьте, как читать часть json от него.

Пример из предоставленной ссылки:

JSONObject jsonObject = (JSONObject) obj;
String name = (String) jsonObject.get("name");

Ответ 2

Вместо JSONObject вы можете использовать ObjectMapper для преобразования java-объекта в строку json

ObjectMapper mapper = new ObjectMapper();
String requestBean = mapper.writeValueAsString(yourObject);

Ответ 3

Вы получаете NullPointerException, поскольку "output" имеет значение null, когда цикл while завершается. Вы можете собирать выходные данные в каком-то буфере, а затем использовать его, что-то вроде этого -

    StringBuilder buffer = new StringBuilder();
    String output;
    System.out.println("Output from Server .... \n");
    while ((output = br.readLine()) != null) {
        System.out.println(output);
        buffer.append(output);
    }
    output = buffer.toString(); // now you have the output
    conn.disconnect();

Ответ 4

Преобразование String в JsonNode с использованием объекта ObjectMapper:

ObjectMapper mapper = new ObjectMapper();

// For text string
JsonNode = mapper.readValue(mapper.writeValueAsString("Text-string"), JsonNode.class)

// For Array String
JsonNode = mapper.readValue("[\"Text-Array\"]"), JsonNode.class)

// For Json String 
String json = "{\"id\" : \"1\"}";
ObjectMapper mapper = new ObjectMapper();
JsonFactory factory = mapper.getFactory();
JsonParser jsonParser = factory.createParser(json);
JsonNode node = mapper.readTree(jsonParser);