web-dev-qa-db-ja.com

Java文字列からJSONへの変換

文字列変数のrestful apiからデータを取得していますが、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で必要な文字列ですが、スレッド「メイン」で例外が表示されます

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)
18
Junaid Akhtar

namedataの中にあります。データを適切に取得するには、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クラスを使用します。


「マシュー」がorg.json.simple.JSONObjectを使用しているというコメントで言及したように、答えにコメントの詳細を追加しています。

代わりにorg.json.JSONObjectを使用してみてください。ただし、JSONライブラリを変更できない場合は、 この例を参照 と同じライブラリを使用し、そこからjsonパーツを読み取る方法を確認できます。

提供されたリンクのサンプル:

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

JSONObjectの代わりに、ObjectMapperを使用してJavaオブジェクトをJSON文字列に変換できます

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

Whileループが終了すると「出力」がnullになるため、NullPointerExceptionが発生します。出力をいくつかのバッファに収集してから使用できます。

    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();
2

ObjectMapperオブジェクトを使用して文字列をJsonNodeに変換する:

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);
1
Rahul Chauhan