2013-03-15 14 views
29

JSONObjectを照会することができるJavaのlibreryがあるかどうか疑問に思っていました。もっと深く私は次のようなものを探しています:JavaのJSONObjectを照会

String json = "{ data: { data2 : { value : 'hello'}}}"; 

... 
// Somehow we managed to convert json to jsonObject 
... 

String result = jsonObject.getAsString("data.data2.value"); 

System.out.println(result); 

私は出力として「hello」を得ることを期待しています。今では

、私が見つけた最速の方法はGsonを使用している:

jsonObject.getAsJsonObject("data").getAsJsonObject().get("data2").getAsJsonObject("value").getAsString(); 

それは実際に読み書きするのは容易ではないのです。何か速いのですか?

答えて

16

まず、JSONオブジェクトバインディングを検討することをお勧めします。

しかし、任意のJSONオブジェクトを取得し、記述した方法でそれらを処理したい場合は、Jackson JSON processorとApacheのCommons Beanutilsを組み合わせることをお勧めします。

ジャクソンはデフォルトですべてのJSONをjava.util.Mapインスタンスとして処理しますが、Commons Beanutilsは配列やマップサポートを含むオブジェクトのプロパティアクセスを簡素化します。

だから、あなたはそれをこのようなものを使用可能性がありますまったく同じではないが、ジャクソンはGsonに似たツリーモデルの表現を持つ

//actually it is a Map instance with maps-fields within 
Object jsonObj = objectMapper.readValue(json, Object.class); 

Object hello = PropertyUtils.getProperty(jsonObj, "data.data2.value") 

System.out.println(hello); //prints hello 
+0

はい、私はすでにオブジェクトのバインディングを考えていました(そして実際に私が通常従う方法です)。しかし、私が取り組んでいるプロジェクトでは、管理するJSONが非常に大きく、その構造が時間の経過とともに大きく変化しています。オブジェクトをバインドすることによって、すべての変更後には本当に時間がかかります。あなたの提案におかげでたくさんありがとう:) – Pamput

+1

これは、 "。"それらに? 1つのキーが「link.required」でそのノードが「number」のようなものだった場合、「link.required.number」は機能しますか? – Penman

1

私は考えていません。

たちは、その後

Student stud = new Student(); 
stud.subject.name; 

をサブジェクト名にアクセスしたい場合ので、我々は正しいサブジェクト名を取得することはありませんならば私たちは、直接名にアクセスカントここ

class Student { 
    Subject subject = new Subject(); 
} 

class Subject { 
    String name; 
} 

Javaクラスを考えてみましょう。ここのように:あなたは同じようなJavaオブジェクトを使用する場合は

jsonObject.getAsJsonObject("data") 
      .getAsJsonObject() 
      .get("data2") 
      .getAsJsonObject("value") 
      .getAsString(); 

その後、

ClassName classObject = new Gson().fromJson(JsonString, ClassName.class); 

を使用するクラス名はjsonstringに一致するようにすべてのフィールドを持っている必要があります。 jsonobjectをjsonobjectの中に持っているなら、私はStudentクラスとSubjectクラスのように別のクラスを作成する必要があります。

+0

私はオブジェクト結合が何であるか知っていますが、通常はjsonを管理するときの方法です:)しかし、私はより高速な方法を探していました(時には、 。 – Pamput

16

を:

JsonNode root = objectMapper.readTree(jsonInput); 
return root.get("data").get("data2").get("value").asText(); 

ので、あなたはそれをすることによって、ステップトラバースする必要がありますステップ。

EDIT(2015年8月)

は実際に今ジャクソンとJSON Pointer式の(ジャクソン2.3以降)のサポートがあります。だから、代わりに使用できます。

return root.at("/data/data2/value").asText(); 
+2

'path'に' get'を変更して、nullを避けることができます。 – Charles

+2

Gsonには何か類似点はありますか? – SaurabhJinturkar

31

を私は予想外に非常に興味深いプロジェクト見つけた:JSON Path

JsonPathは、XMLに与えられた文書の一部を抽出するための簡単な方法は何かXPATH JSONにあります。これはどちらかの役に立つかもしれません

String hello = JsonPath.read(json, "$.data.data2.value"); 

System.out.println(hello); //prints hello 

希望:あなたがさらに簡単に、そして私の以前の提案を要求しているものを行うことができます。このライブラリーでは

+2

JSONの新しいリポジトリの場所Path:https://github.com/jayway/JsonPath – Claus

+0

は、必要なものを正確に表示します。サンプルの説明は非常に便利です – Jeevanantham