web-dev-qa-db-ja.com

Java StringをJSONオブジェクトに変換する方法

この質問は以前に尋ねられましたが、これらの質問への回答からコードのエラーを把握することはできません。


Java文字列をjsonオブジェクトに変換しようとしています。コードは次のとおりです。

import org.json.JSONObject;
//Other lines of code
URL seatURL = new URL("http://freemusicarchive.org/api/get/genres.json?api_key=60BLHNQCAOUFPIBZ&limit=2");
//Return the JSON Response from the API
BufferedReader br = new BufferedReader(new InputStreamReader(seatURL.openStream(),Charset.forName("UTF-8")));
String readAPIResponse = " ";
StringBuilder jsonString = new StringBuilder();
while((readAPIResponse = br.readLine()) != null){
    jsonString.append(readAPIResponse);
}
JSONObject jsonObj = new JSONObject(jsonString);
System.out.println(jsonString);
System.out.println("---------------------------");
System.out.println(jsonObj);

出力は次のとおりです。

{"title":"Free Music Archive - Genres","message":"","errors":[],"total":"163","total_pages":82,"page":1,"limit":"2","dataset":[{"genre_id":"1","genre_parent_id":"38","genre_title":"Avant-Garde","genre_handle":"Avant-Garde","genre_color":"#006666"},{"genre_id":"2","genre_parent_id":null,"genre_title":"International","genre_handle":"International","genre_color":"#CC3300"}]}
---------------------------
{}

ご覧のとおり、jsonstringはデータを取得していますが、jsonObjはデータを取得していません。 org.json JARを使用しています。

7
Nishit

JSONObjectコンストラクターにStringBuilderクラスのインスタンスを渡します。

これは、JSONObject(Object)コンストラクタではなく、JSONObject(String)コンストラクタを使用しています。

コードは次のとおりです。

JSONObject jsonObj = new JSONObject(jsonString.toString());
17
APD

@ Nishit、JSONObjectはStringBuilderを解析する方法をネイティブに理解していません。代わりに、JSONObject(Java.lang.Object bean)コンストラクターを使用してJSONObjectを作成しているように見えますが、StringBuilderに渡します。

特定のコンストラクターの詳細については、このリンクを参照してください。

http://www.json.org/javadoc/org/json/JSONObject.html#JSONObject%28Java.lang.Object%29

コンストラクターがJava.lang.Objectクラスを呼び出すと、おそらくすべてのクラスが(最終的にすべてのクラスがJava.lang.Objectを拡張するため)独自のクラスを作成し、そのクラスとインターフェースすることを期待していることを伝えます特定の方法で、通常は代わりにインターフェイスを呼び出しますが(名前のため)ORそれは.toString()を呼び出すなど、「抽象的に」任意のクラスとインターフェイスを受け入れることができます一番下の行では、通常、それをanyクラスに渡すだけで機能すると期待することはできません。

とにかく、この特定のコンストラクターは次のように説明されます。

Beanゲッターを使用して、オブジェクトからJSONObjectを構築します。オブジェクトのすべてのパブリックメソッドを反映します。パラメーターがなく、名前が "get"または "is"で始まり、その後に大文字が続く各メソッドについて、メソッドが呼び出され、ゲッターメソッドから返されたキーと値が新しいJSONObjectに配置されます。キーは、「get」または「is」プレフィックスを削除することで形成されます。残りの2番目の文字が大文字でない場合、最初の文字は小文字に変換されます。たとえば、オブジェクトに「getName」という名前のメソッドがあり、object.getName()の呼び出し結果が「Larry Fine」の場合、JSONObjectには「name」:「Larry Fine」が含まれます。

したがって、これが意味することは、getまたはメソッドを実装する独自のクラスを作成することを期待しているということです(つまり、.

_public String getName() {...}
_

または

_public boolean isValid() {...}
_

そのため、問題を解決するために、本当に高いレベルの制御が必要で、何らかの操作(値の変更など)を行いたいが、StringBuilderを使用してコードを動的に生成したい場合は、StringBuilderを拡張するクラスを作成できます追加機能を使用できるようにするクラスですが、get/isメソッドを実装してJSONObjectがデータをプルできるようにしますが、これはおそらくあなたが望む/必要なものではなく、JSONによっては、多くの時間を費やす可能性がありますそして、プライベートフィールドとget/isメソッドを作成するエネルギー(またはIDEを使用してあなたのためにそれを行う)またはJSONの内訳を必ずしも知らない場合、それはまったく役に立たないかもしれませんストリング。

したがって、StringBuilderでtoString()を呼び出すだけで、StringBuilderインスタンスのString表現を提供し、それを以下のようにJSONObjectコンストラクターに渡すことができます。

_...
StringBuilder jsonString = new StringBuilder();
while((readAPIResponse = br.readLine()) != null){
    jsonString.append(readAPIResponse);
}
JSONObject jsonObj = new JSONObject(jsonString.toString());
...
_
3
Brooks

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

コンストラクターJSONObjectに渡す文字列は、quote()でエスケープする必要があります。

public static Java.lang.String quote(Java.lang.String string)

コードは次のようになります。

JSONObject jsonObj = new JSONObject.quote(jsonString.toString());
System.out.println(jsonString);
System.out.println("---------------------------");
System.out.println(jsonObj);
0
Ola